日期:2014-05-20  浏览次数:20707 次

jdom追加子节点的问题

<?xml version="1.0" encoding="UTF-8"?>
<explogs xmlns="http://java.sun.com/xml/ns/javaee">
  <logs xmlns="" id="1">
    <content>张三</content>
    <content>李四</content>
    <content>王五</content>
  </logs>
  <logs xmlns="" id="2">
    <content>小黑</content>
    <content>小红</content>
    <content>小白</content>
  </logs>
</explogs>

现在有这样一个xml文件(属性id唯一),我需要读取指定id的元素,然后追加其子节点,
如:读取id=1的logs节点,追加其content节点,追加后的xml如下


<?xml version="1.0" encoding="UTF-8"?>
<explogs xmlns="http://java.sun.com/xml/ns/javaee">
  <logs xmlns="" id="1">
    <content>张三</content>
    <content>李四</content>
    <content>王五</content>
    <content>此为追加的节点</content>
  </logs>
  <logs xmlns="" id="2">
    <content>小黑</content>
    <content>小红</content>
    <content>小白</content>
  </logs>
</explogs>


刚开始接触jdom,了解不深入,在网上查了相关内容也一直打不到我想要的效果,现叙述下我的代码思路:
1、通过SAXBuilder构造器读取xml;
2、通过XPath定位id获取logs元素;
3、new出新的追加节点content;
4、获取的logs元素 addContent 追加节点content;
5、xml文件的rootelement addContent 获取的logs元素

但运行后总有如下错误提示

org.jdom.IllegalAddException: The Content already has an existing parent "explogs"

请诸位指点一二,不胜感激
------最佳解决方案--------------------
你的思路的第5部 完全不需要

因为你 XPath定位id获取logs元素 是对象引用

给他添加了 content 节点后 不需要把 获取的logs元素 add 到 rootElement

LIKE THIS ↓

SAXBuilder builder = new SAXBuilder();
Document xmlJDoc = builder.build(new File("c:\\test.xml"));
Element rootElement = xmlJDoc.getRootElement();

Element logElement = (Element)XPath.selectSingleNode(rootElement, "//explogs/logs[@id=1]");
logElement.addContent(new Element("content").addContent("追加的内容"));

System.out.println(XMLHelper.toXMLString(rootElement));

------其他解决方案--------------------
JDOM的addContent方法会检查文档结构,树结构中不能有循环

第个节点有且仅有一个根元素

Content类有个detach()方法,在添加content的时候调用一下该方法就好了.
logsElement.addContent(logsContentElement.detach())

------其他解决方案--------------------
引用:
JDOM的addContent方法会检查文档结构,树结构中不能有循环

第个节点有且仅有一个根元素

Content类有个detach()方法,在添加content的时候调用一下该方法就好了.


Java code



1

logsElement.addContent(logsContentElement.detach())

非常感谢,我加了detach()方法后,的确追加了,也不报错了,但效果却是这个样子的


<?xml version="1.0" encoding="UTF-8"?>
<explogs xmlns="http://java.sun.com/xml/ns/javaee">
  <logs xmlns="" id="1">
    <content>张三</content>