E4X :ルートノードへの割り当て
-
09-06-2019 - |
質問
ここでは Adobe Flex/Air を使用していますが、私の知る限り、これはすべての JavaScript に当てはまります。私はこの問題に何度か遭遇しましたが、簡単な解決策があるはずです。
次の XML があるとします (e4x を使用)。
var xml:XML = <root><example>foo</example></root>
次のコードを使用して、サンプル ノードの内容を変更できます。
xml.example = "bar";
ただし、これを持っている場合:
var xml:XML = <root>foo</root>
ルートノードの内容を変更するにはどうすればよいですか?
xml = "bar";
XML オブジェクトに文字列を割り当てようとしているので、明らかに機能しません。
解決
変数とそれに含まれる値を混同しているようです。課題
node = textInput.text;
値を変更します 変数 node
が指すオブジェクトでは何も変わりません node
現在は を指します。やりたいことを行うには、 setChildren
の方法 XML
クラス:
node.setChildren(textInput.text)
他のヒント
ああ、ありがとうテオ - 確かに私はそこで混乱していたようです。混乱の根源は、私が割り当てることができたという事実から来ていると思います。
textInput.text = node;
これは、XML->String を変換するために XML.toString() を暗黙的に呼び出しているだけだと思います。setChildren() は私が探していたものです。
ドキュメントのルート要素を変更しようとしている場合、実際には変更する必要はありません。既存のドキュメントを破棄して置き換えるだけです。あるいは、要素をより適切なルート要素でラップするだけで (ルート ノードを編集すべきではありません)、設定は完了します。
もちろん、それではあなたの質問の答えにはなりません。やりたいことを実行できる醜い JS ハックがありますが、上記の方法よりもはるかに遅い可能性があることに注意してください。とにかく、これは次のとおりです。
var xml = <root>foo</root>; // </fix_syntax_highlighter>
var parser = new DOMParser();
var serializer = new XMLSerializer();
// Parse xml as DOM document
// Must inject "<root></root>" wrapper because
// E4X's toString() method doesn't give it to us
// Not sure if this is expected behaviour.. doesn't seem so to me.
var xmlDoc = parser.parseFromString("<root>" +
xml.toString() + "</root>", "text/xml");
// Make the change
xmlDoc.documentElement.firstChild.nodeValue = "CHANGED";
// Serialize back to string and then to E4X XML()
xml = new XML(serializer.serializeToString(xmlDoc));
fix_syntax_highlighter コメントは無視してかまいません。