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はApach 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

関連する問題