JDOM重复元素

时间:2013-05-07 13:25:04

标签: java jdom

我有XML:

<SyncMXAUTHCI>
  <MXAUTHCISet>
    <CI>
      <CINAME>COMPUTER68</CINAME>
      <CIRELATION>INSTALLED</CIRELATION>
    </CI>
  </MXAUTHCISet>
</SyncMXAUTHCI>

我想要重复MXAUTHCISet的内容。 结果将是:

<SyncMXAUTHCI>
  <MXAUTHCISet>
    <CI>
      <CINAME>COMPUTER68</CINAME>
    </CI>
    <CI>
      <CINAME>COMPUTER68</CINAME>
      <CIRELATION>INSTALLED</CIRELATION>
    </CI>
  </MXAUTHCISet>
</SyncMXAUTHCI>

怎么做? 我尝试使用.addContent,.setContnet方法,但没有成功。 如何实现这个目标? 谢谢

更新: 我采用这种形式的元素:

Document erJdom = erData.getData();
Element root = erJdom.getRootElement();
Namespace erJdomNamespace = root.getNamespace();

Element incidentSet = root.getChild("MXAUTHCISet", erJdomNamespace);

Element incident=incidentSet.getChild("CI", erJdomNamespace);

工作正常。 但是当我尝试:

Element incident=incidentSet.getChild("CI", erJdomNamespace);
Element ci2=new Element("CI");
ci2.addContent(incident);

所以你可以看到我尝试获取元素内容并将其放入具有相同内容的新元素中,这将添加到MXAUTHSet 错误我得到: 内容已有现有父级“MXAUTHCISet”

所以它甚至没有到我要添加新元素的部分:

incidentSet.addContent(ci2);

2 个答案:

答案 0 :(得分:1)

如果该内容已附加到元素,则无法将任何JDOM内容添加到任何元素。

最简单的方法是使用clone()方法创建一个未附加的副本。

在你的情况下:

incidentSet.addContent((Element)incidentSet.getChild("CI", erJdomNamespace).clone());

(如果您使用的是JDOM 2.0.x,则clone()方法将返回一个Element ...并且(Element)大小写将是不必要的)

答案 1 :(得分:0)

您必须将重复元素添加到列表中,然后使用addContent将列表添加到结构中的正确位置。

    Document d = new Document();
    Element r = new Element("SyncMXAUTHCI");

    d.setRootElement(r);

    Element e = new Element("MXAUTHCISet");
    r.addContent(e);

    Element ae1 = new Element("CI");
    Element ae2 = new Element("CI");

    Element e2 = new Element("CINAME");
    e2.setText("COMPUTER68");
    ae1.setContent(e2);

    Element e3 = new Element("CINAME");
    e3.setText("COMPUTER68");
    ae2.setContent(e3);

    List l = new ArrayList();
    l.add(ae1);
    l.add(ae2);

    e.addContent(l);

    System.out.println(new XMLOutputter().outputString(d));