LibXML не находит узлы для моего выражения xpath - PullRequest
1 голос
/ 30 сентября 2010

Я использую xpath и LibXML в приложении для iPhone, чтобы найти некоторые узлы в документе XML.Я нуб в xpath, поэтому, вероятно, я делаю что-то не так.Вот xml:


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetUserByEmailResponse xmlns="http://tempuri.org/">
      <GetUserByEmailResult>
        <id>4006</id>
        <name>Kudor Gyozo</name>
        <email/>
        <image/>
        <facebookId>0</facebookId>
      </GetUserByEmailResult>
    </GetUserByEmailResponse>
  </soap:Body>
</soap:Envelope>

Выражение xpath равно //GetUserByEmailResult.Узлы не возвращаются.Я ожидаю получить <GetUserByEmailResult> обратно.Если я протестирую то же самое здесь , все будет нормально.

ОБНОВЛЕНИЕ1: Это то, что я получаю от веб-службы .netЕсть ли способ игнорировать пространства имен в libxml?

Ответы [ 2 ]

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

Я не знаком с библиотекой iphone, но вам, вероятно, придется где-то объявить namsepace / prefix: если вы зарегистрируете 'http://tempuri.org/' с помощью' someprefix ', вы можете искать:

//someprefix:GetUserByEmailResult

Возможный обходной путь (но не рекомендуется):

//*[local-name()='GetUserByEmailResult']
2 голосов
/ 30 сентября 2010

Элемент GetUserByEmailResult находится в пространстве имен http://tempuri.org/, поэтому вам необходимо добавить это пространство имен в поиск XPath.

Это можно сделать с помощью функции xmlXPathRegisterNs:

xmlXPathRegisterNs(context,  BAD_CAST "temp", BAD_CAST "http://tempuri.org/");

Тогда ваш XPath должен быть изменен на

//temp:GetUserByEmailResult
...