gpt4 book ai didi

xml - 如何使用 Omni XML 中的命名空间来使用 XML SelectNodes()

转载 作者:行者123 更新时间:2023-12-03 18:40:36 24 4
gpt4 key购买 nike

我有一个 XML 文档,其中包含具有 namespace 的元素。我想根据某个命名空间和某个元素从该 XML 中选择节点。使用 MSXML 供应商时,您可以使用 SetProperty('SelectionNameSpaces', 'nn:mmmm') 语句完成此操作。
但是因为我们当前的项目将是多平台的,所以我不能使用 MSXML 供应商。我正在尝试使用 OmniXML 供应商,但我找不到如何在 SelectNodes() 语句中使用 namespace 。

在下面的代码中,我尝试使用 DeclareNameSpace() 但这不起作用。 SelectNodes 语句没有找到任何节点并且列表保持为空。

我该如何解决这个问题?

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils,
XML.XMLDom,
XML.XMLDoc,
XML.omnixmldom,
XML.XMLIntf
;

const
cXML = '<?xml version="1.0"?>' +
'<catalog xmlns:xs12=''http://www.w3.org/2001/XMLSchema-instance''>' +
' <xs12:book id="bk101">' +
' <xs12:author>Gambardella, Matthew</xs12:author>' +
' <xs12:title>XML Developers Guide</xs12:title>' +
' <xs12:genre>Computer</xs12:genre>' +
' <xs12:price>44.95</xs12:price>' +
' <xs12:publish_date>2000-10-01</xs12:publish_date>' +
' <xs12:description>An in-depth look at creating applications with XML.</xs12:description>' +
'</xs12:book>'
+ '</catalog>'
;
var
lDoc: IXMLDocument;
lList: IDOMNodeList;
lSelectNode: IdomNodeSelect;
begin

DefaultDOMVendor := sOmniXmlVendor;
try
try
lDoc := LoadXMLData(cXML);

lDoc.DocumentElement.DeclareNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');

if supports(lDoc.DOMDocument, IDomNodeSelect, lSelectNode) then
begin
lList := lSelectNode.selectNodes('a:book');
Writeln(Format( '%d nodes', [lList.length]));
end;

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
end;
end.

最佳答案

似乎 OmniXML 不支持。我在这个主题上找到的所有帖子都没有提供这个问题的答案。

我确实设法通过使用另一个 XML 实现来解决这个问题:OXML
这个实现有一个 SelectNodesNS()正是我正在寻找的功能。
它可以通过颠覆获得。更多信息:http://www.kluug.net/oxml.php

使用 OXML 的示例项目:

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils,
OXMLPDOM
;

const
cXML = '<?xml version="1.0"?>' +
'<catalog xmlns:xs12=''http://www.w3.org/2001/XMLSchema-instance''>' +
' <xs12:book id="bk101">' +
' <xs12:author>Gambardella, Matthew</xs12:author>' +
' <xs12:title>XML Developers Guide</xs12:title>' +
' <xs12:genre>Computer</xs12:genre>' +
' <xs12:price>44.95</xs12:price>' +
' <xs12:publish_date>2000-10-01</xs12:publish_date>' +
' <xs12:description>An in-depth look at creating applications with XML.</xs12:description>' +
'</xs12:book>'
+ '</catalog>'
;
var
doc: IXMLDocument;
list: IXMLNodeList;
begin

try
try
doc := CreateXMLDoc;
Doc.LoadFromXML(cXML);

doc.DocumentElement.SelectNodesNS('http://www.w3.org/2001/XMLSchema-instance', 'book', list);
Writeln(Format( '%d nodes', [List.count]));

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
end;
end.

关于xml - 如何使用 Omni XML 中的命名空间来使用 XML SelectNodes(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com