XPath-запрос для узла - PullRequest
       6

XPath-запрос для узла

3 голосов
/ 19 сентября 2010

Я должен делать что-то не так.Что такое запрос XPath для всех узлов с именем "name" в отображаемом имени?Я использую libxml2.

<?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>

Ответы [ 2 ]

6 голосов
/ 19 сентября 2010

Ваш документ имеет пространство имен по умолчанию, поэтому вам нужно зарегистрировать это пространство имен в своем выражении. Я никогда не использовал libxml2, но, глядя на их примеры , может показаться, что вам нужна функция xmlXPathRegisterNs

Обратите внимание, что при регистрации пространства имен префикс, который вы выбираете для выражения XPath, не должен совпадать с префиксом (если есть), используемым в документе. Поскольку ваш документ использует пространство имен по умолчанию (не префикс), он определенно не будет. Однако вам все равно нужно использовать префикс в вашем XPath:

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

5 голосов
/ 20 сентября 2010

Вот что сработало:

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