ここに大きな謎があり、
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 に変換すると、機能します。しかし、これは本当の解決策ではありません。正しい文書オブジェクトを取得するためにその変換を行ったり来たりするのは不十分です。ここで何が問題なのですか?新しい子の名前空間を修正できないと思います。