Невозможно найти корневой элемент с XPath без пространства имен

Я анализирую XML с сервера carddav с помощью libxmljs (js-привязка libxml). Рассмотрим следующие два примера:

Пример 1, приходит от Apple ICloud CardDav

<d:multistatus xmlns="DAV:">
    <response>
        <href>/</href>
            <propstat>
                <prop>
                    <current-user-principal>
                        <href>/principals/users/johndoe/</href>
                    </current-user-principal>
                </prop>
            <status>HTTP/1.1 200 OK</status>
        </propstat>
    </response>
</d:multistatus>

Пример 2, взят из API Google CardDav

<d:multistatus xmlns:d="DAV:">
    <d:response>
        <d:href>/</d:href>
        <d:propstat>
            <d:prop>
                <d:current-user-principal>
                    <d:href>/principals/users/johndoe/</d:href>
                </d:current-user-principal>
            </d:prop>
            <d:status>HTTP/1.1 200 OK</d:status>
        </d:propstat>
    </d:response>
</d:multistatus>

Как вы заметите, первый фрагмент имеет корневой элемент с префиксом пространства имен "d:", а остальные вообще не содержат пространства имен. Во втором фрагменте все элементы имеют префикс "d:".

LibXML не может найти элемент мультистатуса в первом фрагменте, когда я использую следующую строку:

var multistatusElement = xmlDoc.get('//xmlns:multistatus', 'DAV:');

Эта строка отлично работает для второго фрагмента.

После того, как я получил элемент мультистатуса, я делаю следующее:

var responseElement = multistatusElement.get('xmlns:response', 'DAV:');

Эта строка отлично работает для обоих фрагментов, если я просто возьму корневой элемент в качестве элемента мультистатуса для первого фрагмента.

Кто-нибудь знает, почему этот код не может найти элемент multiistatusElement?

0 ответов

Другие вопросы по тегам