2016-08-04 23 views
1

Я поставил тот же вопрос на сайте 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

Есть некоторые проблемы с синтаксисом. Я приведу лишь короткий пример, поскольку другие дочерние узлы следуют одному и тому же шаблону. Обратите внимание, что docNode фактически является именно этим документом. MATLAB использует DOM-модель Apache xerxes, а функция 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

+0

Спасибо за это. Коллега предоставил другое средство для этого: parent_node = docNode1.getElementsByTagName ('Parent'). Item (0) –

+0

@Paul_Sponagle вправо, это определенно возможно. Я рассматриваю это как раздражающее и предпочитаю рекурсивные методы для такого рода вещей (чего это не так). Однако, безусловно, возможно сделать это и по-своему (и иногда это должно быть сделано именно так). Просто имейте в виду, что у каждого родителя может быть несколько детей, а затем вам нужно выполнить поиск среди всех детей, и все будет в порядке. Кроме того, даже если вы вернете ребенка, вам не нужно его использовать, но в случае, если вы будете использовать его, вы будете действительно счастливы, что сможете. – patrik

Смежные вопросы