如何将子节点附加到传递给函数的现有父节点?

时间:2016-08-04 18:25:03

标签: xml matlab function append

我在Mathworks网站上提出了相同的问题。

我正在尝试向函数发送xml结构,附加新节点,并返回修改后的结构。这是因为附加的子结构对于许多'.xml'文件来说非常常见,我不想每次都重写相同的代码。

如果我不在函数中,则以下工作:

   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);

如果我尝试将其传递给这样的函数:

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

此函数不会将子项附加到父节点:

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>

任何帮助将不胜感激,

1 个答案:

答案 0 :(得分:0)

语法存在一些问题。我将只给出一个简短的例子,因为其他子节点遵循相同的模式。请注意,docNode实际上就是这个文档。 MATLAB使用Apaches xerxes DOM模型,函数createDocument()返回类型为org.apache.xerces.dom.CoreDocumentImpl的对象。您不会附加到文档,而是附加到文档元素(org.apache.xerces.dom.ElementImpl)。所以你需要先获取文档元素。不要对Impl部分感到困扰。这只是因为org.w3c.dom中定义的接口必须要实现,而Impl只是这些接口的实现。

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);

这也适用于子功能,

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;

您还可以定义一个将子项添加到当前文档元素的函数。为了能够按孩子添加孩子,您需要每次都返回添加的孩子。否则你将不得不进行元素搜索以找到有时可能需要的元素,但对于大多数情况,这很烦人。请注意,这是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

上看到包含属性的更长示例