【问题标题】:Append node to an existing xml-Java将节点附加到现有的 xml-Java
【发布时间】:2009-09-16 06:15:24
【问题描述】:

我已经看到针对 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>

【问题讨论】:

    标签: java xml


    【解决方案1】:

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

    【讨论】:

    • 编辑...虽然如果您想了解如何在这些元素中创建内容,在问题中这样说会很有用。
    • 我看到这是一篇古老的帖子,但是关于您的“呃”,您更喜欢 W3C DOM 的 XML API 吗?为什么这么说?
    • @jdwilemo:W3C DOM API 真的很丑,IMO - 它充满了工厂等等,构造不鼓励遵循文档最终结构的代码等。与 LINQ 之类的东西相比.NET 中的 XML,这绝对是可怕的。
    • @JonSkeet:我明白了,谢谢你的回复。但是在 Java 中呢?是否有其他 API 可以替代 W3C?
    • @jdwilemo:各种 - 你可能想先看看 JDom:jdom.org
    【解决方案2】:

    最严格的方法是使用 SaxDom 将所有文件解析为数据结构,例如具有 B 的 A 类在您的情况下,具有 C、D、E 类成员的类。

    并将数据结构输出回XML。

    【讨论】:

      【解决方案3】:

      你可能想用vtd-xml的XMLModier来做一个很酷的方法,就是直接追加字节内容...你只需要调用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"));
               }
           }
      
      }
      

      【讨论】:

      • 您介意补充一下为什么这是一个很酷的方法吗?这听起来与我听说过的任何事情都相反。另外,为什么这个答案是社区 Wiki?
      • 这很酷,因为它直接是字节级附加,而不是数据结构级附加......我想我在我的帖子中解释过......“附加字节内容”
      • 是的,您只是没有说为什么字节级追加很酷,而且不仅仅是一个使代码依赖于 XML 文档编码的坏主意。
      • 你没有回答为什么你觉得这个答案应该是 CW,而其他答案都不是。 CW请见meta.stackexchange.com/questions/7931/…
      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多