2012-04-14 3 views
0

Я хотел бы вставить узел в XML-файл с использованием Java DOM. Я фактически редактирую большое количество файла фиктивного файла, чтобы сделать его похожим на оригинал.Вставка узла в файл xml

Я хотел бы добавить открытый узел и закрыть узел между следующим файлом;

  <?xml version="1.0" encoding="utf-8"?> 
      <Memory xmlns:xyz="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:abc="http://www.w3.org/2001/XMLSchema" Derivative="ABC"    
      xmlns="http://.."> 

     ///////////<Address> ///////////(which I would like to insert) 

      <Block --------- 
      -------- 
      ------- 
      /> 

     ////////// </Address> /////////(which I would like to insert) 

      <Parameters Thread ="yyyy" /> 
      </Memory> 

Настоящим я прошу вас сообщить, как мне вставить - между файлом xml?

Заранее спасибо.!

То, что я пробовал делать;

  Element child = doc.createElement("Address"); 
    child.appendChild(doc.createTextNode("Block")); 
    root.appendChild(child); 

Но это дает мне выход;

 <Address> Block </Address> and not the way i expect :(

И теперь я попытался добавить эти строки;

  Element cd = doc.createElement("Address"); 
      Node Block = root.getFirstChild().getNextSibling(); 
     cd.appendChild(Block); 
     root.insertBefore(cd, root.getFirstChild()); 

Но все же, это не выход, который я ищу. Я получил этот вывод как ---------

+0

Ваш подход является правильным, но текстовый узел просто текстовый узел ... попробуйте [createElement] (http://docs.oracle.com/javase/6/ docs/api/org/w3c/dom/Document.html # createElement (java.lang.String)) – home

+0

Если я попытаюсь создать элемент, элемент просто будет создан. Но я должен упомянуть, что элемент должен быть создан до «Блока», так как я должен это указать? – dmurali

+0

BCoz, у меня уже есть вся информация в разделе «Блок», я просто должен добавить тег «Адрес» перед ним и после него. – dmurali

ответ

1

Здесь:

DocumentBuilder b = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document document = b.parse(...); 

// Parent of existing Block elements and new Address elemet 
// Might be retrieved differently depending on 
// actual structure 
Element parent = document.getDocumentElement(); 
Element address = document.createElement("address"); 

NodeList nl = parent.getElementsByTagName("Block"); 
for (int i = 0; i < nl.getLength(); ++i) { 
    Element block = (Element) nl.item(i); 
    if (i == 0) 
     parent.insertBefore(address, block); 
    parent.removeChild(block); 
    address.appendChild(block); 
} 

// UPDATE: how to pretty print 

LSSerializer serializer = 
    ((DOMImplementationLS)document.getImplementation()).createLSSerializer(); 
serializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); 
LSOutput output = 
    ((DOMImplementationLS)document.getImplementation()).createLSOutput(); 
output.setByteStream(System.out); 
serializer.write(document, output); 
+0

Awesome ..! Thanx a ton ..! It works ..! – dmurali

+0

Выход выходит в одну строку. вы скажите мне, как я могу использовать разделитель строк в этом случае? Должно ли это быть \ n?? – dmurali

+0

Ну, этот код не будет принимать во внимание пустое пространство. Как вы выписываете документ? Используете ли вы LSSerializer? –

0

Предполагается, что вы используете W3C DOM (например, http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html). Если это так попробуйте

insertBefore(address, block); 
+0

: спасибо за ваш ответ .. но могу ли я знать, что это означает (адрес, блок)? – dmurali

+0

Да, я использую w3c dom. !! – dmurali

+0

Сделал изменения в том, что я пробовал сейчас. Обратимся к коду в моем сообщении. – dmurali

2

То, что вы хотите, вероятно:

Node parent = block.getParentNode() 
Node blockRemoved = parent.removeChild(block); 
// Create address 
parent.appendChild(address); 
address.appendChild(blockRemoved); 

Это стандартный способ повторно прикрепить узел в другом месте под W3C DOM.

+0

Привет, Спасибо за наше предложение. Но теперь сомневаюсь, когда я инициализирую «адрес» и «блок»; я должен дать «Node Block = root.getFirstChild()» && «Node address = root.getLastChild(). getPreviousSibling()»? – dmurali

+0

Вы получаете исходный элемент блока, используя код, который вы опубликовали, но вы должны создать новый элемент адреса, используя 'createElement()'. –

+0

Это оставляет меня снова с тем же выпуском, который я опубликовал выше :( – dmurali

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