2009-09-16 4 views
4

Я видел тот же вопрос, на который отвечали за vb и C#, но мне нужно лучшее решение для добавления узлов в xml. Помог ли xpath? У меня естьДобавить узел в существующую xml-Java

<A> 
    <B> 
    <c>1<c/> 
    <d>2<d/> 
    <e>3<e/> 
    </B> 
    <B> 
    <c>1<c/> 
    <d>2<d/> 
    <e>3<e/> 
    </B> 
</A> 

нужно добавить еще один

<B> 
    <c>11<c/> 
    <d>21<d/> 
    <e>31<e/> 
</B> 

ответ

13

XPath поможет вам найти узлов, но на самом деле не добавлять их. Я не думаю, что вы найдете его особенно полезным здесь.

Какой XML-интерфейс вы используете? Если это в W3C DOM (Urgh), то вы могли бы сделать что-то вроде:

Element newB = document.createElement("B"); 
Element newC = document.createElement("c"); 
newC.setTextContent("11"); 
Element newD = document.createElement("d"); 
newD.setTextContent("21"); 
Element newE = document.createElement("e"); 
newE.setTextContent("31"); 
newB.appendChild(newC); 
newB.appendChild(newD); 
newB.appendChild(newE); 
document.getDocumentElement().appendChild(newB); 
+0

и значения c, d, e? – Ajay

+0

Редактирование ... хотя, если вы хотите посмотреть, как создать контент в этих элементах, было бы полезно сказать это в вопросе. –

+0

извините ... сделали это! .. спасибо за ответ – Ajay

2

Наиболее смирительная вперед способ является то, что вы разбираете, используя Sax или Dom, все файлы в структуру данных , например класс A, который имеет класс B с членами класса C, D, E в вашем случае.

И вывести структуру данных обратно в XML.

0

Возможно, вы захотите использовать XMLModier для vtd-xml, чтобы сделать это простым образом, чтобы добавить содержимое байта напрямую ... Вам просто нужно вызвать вставку XMLModier insertAfterElement() ... ниже - ссылка к образцу кода: Incrementally Modify XML in Java:

import com.ximpleware.*; 
import java.io.*; 

public class ModifyXML { 
    public static void main(String[] s) throws Exception{ 
     VTDGen vg = new VTDGen(); // Instantiate VTDGen 
     XMLModifier xm = new XMLModifier(); //Instantiate XMLModifier 
     if (vg.parseFile("old.xml",false)){ 
      VTDNav vn = vg.getNav(); 
      xm.bind(vn); 

      // first update the value of attr 
      int i = vn.getAttrVal("attr"); 
      if (i!=-1){ 
        xm.updateToken(i,"value"); 
      } 

      // navigate to <a> 
      if (vn.toElement(VTDNav.FC,"a")) { 
        // update the text content of <a> 
        i=vn.getText(); 
        if (i!=-1){ 
         xm.updateToken(i," new content "); 
        } 
        // insert an element before <a> (which is the cursor element) 
        xm.insertBeforeElement("<b/>\n\t"); 

        // insert an element after <a> (which is the cursor element) 
        xm.insertAfterElement("\n\t<c/>"); 
      } 

      xm.output(new FileOutputStream("new.xml")); 
     } 
    } 

} 
+1

Не могли бы вы добавить, почему это классный способ? Это звучит противоположно всему, что я когда-либо слышал. Кроме того, почему этот ответ Community Wiki? –

+0

это классно, потому что он добавлен прямо в байтовый уровень, в отличие от уровня данных strcuture append ... Я думаю, что объяснил, что в моем посте ... «добавить содержимое байта» –

+0

Да, вы просто не сказали, почему уровень байта append - это круто, а не просто плохая идея, которая делает код зависимым от кодировки XML-документа. –