Delphi / MSXML:XPath查询失败

前端之家收集整理的这篇文章主要介绍了Delphi / MSXML:XPath查询失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经加载了一个XML文档,现在我希望运行一个XPath查询来选择XML的某个子集. XML是
<?xml version="1.0"?>
<catalog xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
   <book id="bk101">
      <author>Gambardella,Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications with
      XML.</description>
   </book>
</catalog>

而程序就是这样的

procedure RunXPathQuery(XML: IXMLDOMDocument2; Query: string);
begin

  XML.setProperty('SelectionLanguage','XPath');

  NodeListResult := XML.documentElement.selectNodes(Query));

  ShowMessage('Found (' + IntToStr(NodeListResult.length) + ') nodes.');

end;

问题是:当我为上述XML运行XPath查询’/ catalog’时,它返回(如预期的)1个元素的节点列表.但是,如果我删除:xsi
< catalog xmlns:xsi ='http://www.w3.org/2001/XMLSchema-instance'\u0026gt;并重新运行查询,返回的nodelist为空.如果我删除整个'xmlns'属性,结果节点列表再次有1个元素. 所以我的问题是:我该怎么做才能解决这个问题,即如何使MSXML返回正确数量的实例(运行XPath查询时),而不管命名空间(或其他属性)如何? 谢谢!

解决方法

this link

当您使用< catalog xmlns ='http://www.w3.org/2001/XMLSchema-instance'\u0026gt;然后整个节点将被移动到另一个(默认)命名空间.您的XPath不会查看此其他命名空间,因此无法找到任何数据.使用< catalog xmlns:xsi ='http://www.w3.org/2001/XMLSchema-instance'\u0026gt;你只是将xsi声明为一个不同的命名空间.这将是与默认命名空间不同的命名空间. 我现在无法测试它,但添加一些东西like this可能会有所帮助:

XML.setProperty('SelectionNamespaces','xmlns=''http://www.w3.org/2001/XMLSchema-instance''');

或者它可能没有.正如我所说,我现在无法测试它.

猜你在找的Delphi相关文章