Невозможно найти корневой элемент с 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?