문제

여기서는 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 주석은 무시해도 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top