1

ここに大きな謎があり、

Gdataxml ドキュメント プロパティがあります。

GDataXMLDocument *doc;

doc に新しい要素を追加しています。興味深いことに、以下のこのメソッドは他の要素には完璧に見えますが、追加したばかりの要素には適していません。

GDataXMLElement *newValueDefElement = [GDataXMLNode elementWithName:@"valuedefinition"];
[variableElement addChild:newValueDefElement];

そして今、クエリを実行すると:

NSString *path = [NSString stringWithFormat:@"//inferenceresponse/state/variable[pageId=%d]/valuedefinition",pageID];       
NSArray *valueElement = [self.doc nodesForXPath:path error:nil];

配列にはオブジェクトがありません。新しい追加要素が見つかりません! しかし、デバッグでxml文字列として表示できますが、ログにあることがわかるものを見つけられないのはどうしてですか? キャッシュの問題ですか、名前空間の問題ですか、それとも GDataXML のバグですか? 再び..問題は新しい子を追加することであり、ドキュメントで何らかの形で更新されていませんが、同じXpathクエリ標準を使用すると、同じルートの下に他の要素を取得できます

NSlog では、新しい要素が doc に追加されていることがわかります。

NSData *xmlData2 = self.doc.XMLData;
NSString *s= [[[NSString alloc] initWithBytes:[xmlData2 bytes] length:[xmlData2 length] encoding:NSUTF8StringEncoding] autorelease];
NSLog(s);

また、self.doc.XMLData は [self.doc nodesForXPath] とは異なるものをどのように与えることができますか? だから、私のドキュメントは大丈夫だと思い込んでいるのですが、前のメソッドでいくつかの要素を追加して削除しているときに、ドキュメントを破損したか、名前空間が間違っていたのでしょうか?

私のxmlは次のように始まります:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<inferenceresponse xmlns="">
<state goalreached="false">
..
..

アップデート

(ハッキーな)解決策を見つけました。「doc.XMLData」を使用して「doc」を NSData に変換し、再度 doc に変換すると、機能します。しかし、これは本当の解決策ではありません。正しい文書オブジェクトを取得するためにその変換を行ったり来たりするのは不十分です。ここで何が問題なのですか?新しい子の名前空間を修正できないと思います。

4

1 に答える 1

1

あなたの問題はここにあります:

<inferenceresponse xmlns="">

空の名前空間属性は、明らかに libxml XPath 評価を混乱させます。GDataXMLNode の をステップ実行するとnodesForXPath:namespaces:error:xmlXPathEval実際には空のノード セットが返されます。

XML 生成を制御できる場合は、空の属性を削除した正しい XPath 結果が得られます。

<inferenceresponse>

サーバーの応答を変更するのが難しすぎる場合は、次のように編集できます。 GDataXMLNode 実装でGDataXMLNode.mメソッドを検索し、行を置き換えます。fixQualifiedNamesForNode:graftingToTreeNode:

if (foundNS != NULL) {
    // we found a namespace, so fix the ns pointer and the local name

if (foundNS != NULL && foundNS->href != NULL && strlen((char *)foundNS->href) != 0) {
    // we found a namespace, so fix the ns pointer and the local name
于 2011-08-17T11:32:07.930 に答える