微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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''');

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

原文地址:https://www.jb51.cc/delphi/103011.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐