Добавить узел к существующей xml-Java - PullRequest
4 голосов
/ 16 сентября 2009

Я видел ответ на тот же вопрос для vb и c #, но мне нужно лучшее решение на Java для добавления узлов в xml. Поможет ли xpath? У меня

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

Ответы [ 3 ]

13 голосов
/ 16 сентября 2009

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

Какой XML API вы используете? Если это 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);
2 голосов
/ 16 сентября 2009

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

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

0 голосов
/ 16 сентября 2009

Возможно, вы захотите использовать XMLModier из vtd-xml, чтобы сделать это классным способом, то есть напрямую добавить содержимое байта ... Вам просто нужно вызвать метод insertAfterElement () XMLModier ... ниже приведена ссылка на пример кода: Инкрементное изменение XML в 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"));
         }
     }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...