2010-09-19 170 views
3

我应该做错了什么。显示名称下名为“name”的所有节点的XPath查询是什么?我正在使用libxml2。XPath查询节点

<?xml version="1.0" encoding="UTF-8"?> 
<description xmlns="http://openoffice.org/extensions/description/2006" xmlns:d="http://openoffice.org/extensions/description/2006" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <version value="2010.05.25" /> 
    <identifier value="German.frami2006DE.dictionary.from.org.openoffice.de.by.Karl.Zeiler" /> 
    <display-name> 
     <name lang="en">German (DE-frami) spelling, hyphenation, thesaurus</name> 
     <name lang="de">Deutsche (DE-frami) Rechtschreibung, Trennung, Thesaurus</name> 
    </display-name> 
    <platform value="all" /> 
    <dependencies> 
     <OpenOffice.org-minimal-version value="3.0" d:name="OpenOffice.org 3.0" /> 
    </dependencies> 
</description> 

回答

6

您的文档有一个默认命名空间,所以您需要在表达式中注册该命名空间。我从来没有用过libxml2,但看着他们examples,它会出现你想要的功能是xmlXPathRegisterNs

注意,当您注册一个命名空间,你选择你的XPath表达式不具有匹配前缀文档中使用的前缀(如果有)。既然你是文档使用默认名称空间(不是前缀),它肯定不会。但是,你仍然需要在你的XPath使用前缀:

/ns:description/ns:display-name/ns:name

5

这里是什么工作:

xmlXPathRegisterNs(Ctxt, 'ns1', 'http://openoffice.org/extensions/description/2006'); 
Res := xmlXPathEval('//ns1:name', Ctxt);