4

ObjectiveCでのxml解析にGDataXMLライブラリを使用しているiOSアプリを作成しています。

私は次のxmlを持っています(私は石鹸の応答として取得します):

<?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <MakeRequestResponse xmlns="http://tempuri.org/">
        <MakeRequestResult>SOMERANDOMDATAHERE012912033905345346</MakeRequestResult>
      </MakeRequestResponse>
    </soap:Body>
  </soap:Envelope>

私が抱えている問題は次のとおりです。

指定されたxmlのxpath式を次のように記述すると、MakeRequestResponseノードが取得されます。

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/*" error:&error];

ただし、実際のノード名を書き込むと、このノードまたは以下の子を取得できません。

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/MakeRequestResponse" error:&error];

ここで何が問題なのかわかりません。名前空間に関連する問題でしょうか?

4

1 に答える 1

8

これはよくある質問です (XPath とデフォルトの名前空間を検索してください)。

簡単に言えば、XPath 式が評価されるとき、接頭辞のない名前は「名前空間なし」にあると見なされます。ただしMakeRequestResponse、「名前空間なし」にないため、選択されていません。

解決策:

"http://tempuri.org/"名前空間を登録し、それにプレフィックス (たとえば"x:") を関連付けてから、次を使用します。

soap:Body/x:MakeRequestResponse

または、そうでない場合は、次のような式を使用できます。

soap:Body/*[name() = 'MakeRequestResponse']
于 2011-11-15T15:33:16.170 に答える