我在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>
任何帮助将不胜感激,
保
答案 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.
如果你想保留对父母的引用,那么你可以只为每个函数调用定义新的变量。
上看到包含属性的更长示例