2016-08-04 2 views
1

Mathworks 사이트에서 같은 질문을했습니다.함수에 전달 된 기존 부모 노드에 자식 노드를 추가하려면 어떻게합니까?

함수에 XML 구조를 보내고 새 노드를 추가하고 수정 된 구조를 반환하려고합니다. 이는 추가되는 하위 구조가 많은 '.xml'파일에 매우 공통적 일 것이므로 매번 동일한 코드를 다시 작성하기를 원하지 않기 때문입니다.

나는 다음과 같은 작품 함수에 아닙니다 경우

docNode = com.mathworks.xml.XMLUtils.createDocument('ugcs-Transfer'); 
    parent_node = docNode.createElement('parent') 
    docNode.appendChild(parent_node) 
    docNode = myFunction(docNode) 

이 기능은에 아이를 추가하지 않습니다 :이 같은 함수에 전달하려고하면

docNode = com.mathworks.xml.XMLUtils.createDocument('ugcs-Transfer'); 
    parent_node = docNode.createElement('parent') 
    docNode.appendChild(parent_node) 
    child_node = docNode.createElement('child'); 
    parent_node.appendChild(child_node); 

부모 노드는 :

Z = my_function(docNode) 
    child_node = docNode.createElement('child'); 
    parent_node.appendChild(child_node); % This line produces an error: 
    %Undefined variable "parent_node" or ... 
    %class "parent_node.appendChild". 
    Z = docNode 
end 

원하는 최종 상태가 될 것이다 :

,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <parent> 
     <child> 

어떤 도움을 주시면 감사하겠습니다,

바울은

답변

0

구문에 몇 가지 문제가 있습니다. 나는 다른 자식 노드들이 같은 패턴을 따르고 있기 때문에 짧은 예제만을 제공 할 것이다. docNode은 실제로 문서 일뿐입니다. MATLAB은 Apache xerxes DOM 모델을 사용하고 함수 createDocument()org.apache.xerces.dom.CoreDocumentImpl 유형의 객체를 반환합니다. 문서에 추가하지 않고 문서 요소 (org.apache.xerces.dom.ElementImpl)에 추가합니다. 따라서 먼저 문서 요소를 가져와야합니다. Impl 부분에 대해 신경 쓰지 마세요. 이는 org.w3c.dom에 정의 된 인터페이스가 구현되어야하고 Impl이 이러한 인터페이스의 구현 일 뿐이 기 때문입니다. 또한 현재 문서의 요소에 자식을 추가하는 기능을 정의 할 수 있습니다

function test() 
docNode = com.mathworks.xml.XMLUtils.createDocument('ugcs-Transfer'); 
docNode = subfun(docNode); 
q=xmlwrite(docNode); 
disp(q); 

function T = subfun(docNode) 
parent_node_elem = docNode.getDocumentElement(); % Append to this and not docNode. 
parent_node = docNode.createElement('parent'); 
parent_node_elem.appendChild(parent_node); 
T = parent_node_elem; 

docNode = com.mathworks.xml.XMLUtils.createDocument('ugcs-Transfer'); 
parent_node_elem = docNode.getDocumentElement(); % Append to this and not docNode. 
parent_node = docNode.createElement('parent'); 
parent_node_elem.appendChild(parent_node); 
xmlwrite(docNode); 

이것은 또한 하위 기능을 사용하여 작동합니다. 자녀가 추가 할 수 있으려면 매번 추가 된 자녀를 돌려 보내야합니다. 그렇지 않으면 때때로 요소가 될 수있는 요소를 찾기 위해 요소 검색을 수행해야하지만 대부분의 경우이 방법은 귀찮습니다. 이것은 Java 코드이므로 여기에서 참조가 작동합니다.

function test() 
docNode = com.mathworks.xml.XMLUtils.createDocument('ugcs-Transfer'); 
parent_node = docNode.getDocumentElement(); 
parent_node = subfun(docNode, parent_node,'parent'); 
parent_node = subfun(docNode, parent_node,'child'); 
q=xmlwrite(docNode); 
disp(q); 

function T = subfun(docNode, elemNode, name) 
child_node = docNode.createElement(name); 
elemNode.appendChild(child_node); 
T = child_node; % Return the newly added child. 

부모에 대한 참조를 유지하려면 각 함수 호출에 새로운 변수를 정의하면됩니다.

속성을 모두 가진 이상 예는이에 대한 xmlwrite reference page

+0

감사에서 볼 수 있습니다. 동료가이 작업을 수행하는 또 다른 방법을 제공했습니다. parent_node = docNode1.getElementsByTagName ('Parent'). item (0) –

+0

@Paul_Sponagle 맞습니다. 나는 이것을 성가심으로 생각하고 실제로 이런 종류의 물건에 대한 재귀 적 방법을 선호한다 (이것은 그렇지 않다). 그러나, 그것은 당신의 방법으로도 가능합니다 (때로는 그렇게해야합니다). 각 부모가 여러 자녀를 가질 수 있다는 것을 명심하십시오. 그러면 모든 어린이들 사이에서 검색을해야하며 모두 괜찮을 것입니다. 또한, 아이를 다시 돌려 주더라도 아이를 사용하지 않아도되지만, 아이를 사용하려면 정말로 행복 할 것입니다. – patrik

관련 문제