jdom追加子节点的问题

yiyi_wx 2012-11-09 12:51:14

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

请诸位指点一二,不胜感激
...全文
376 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyi_wx 2012-11-09
  • 打赏
  • 举报
回复
引用 3 楼 cscript 的回复:
你的思路的第5部 完全不需要 因为你 XPath定位id获取logs元素 是对象引用 给他添加了 content 节点后 不需要把 获取的logs元素 add 到 rootElement LIKE THIS ↓ Java code 123456789 SAXBuilder builder = new SAXBuilder(); Document xm……
不好意思,是我刚才粗心看错了,没动脑子,的确是正确的,没问题,非常感谢
yiyi_wx 2012-11-09
  • 打赏
  • 举报
回复
引用 3 楼 cscript 的回复:
你的思路的第5部 完全不需要 因为你 XPath定位id获取logs元素 是对象引用 给他添加了 content 节点后 不需要把 获取的logs元素 add 到 rootElement LIKE THIS ↓ Java code 123456789 SAXBuilder builder = new SAXBuilder(); Document xm……
非常感谢您的回答,只是这样的话仅仅是把新节点加到内存里去了吧?我测试了下,xml文档并没有被修改
cscript 2012-11-09
  • 打赏
  • 举报
回复
你的思路的第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));
yiyi_wx 2012-11-09
  • 打赏
  • 举报
回复
引用 1 楼 VS_2010 的回复:
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>
    <content>李四</content>
    <content>王五</content>
  </logs>

  <logs xmlns="" id="2">
    <content>小黑</content>
    <content>小红</content>
    <content>小白</content>
  </logs>


  <logs xmlns="" id="1">
    <content>张三</content>
    <content>李四</content>
    <content>王五</content>
    <content>此为追加的节点</content>
  </logs>

</explogs>
等于又重新生成了id为1的新logs节点
VS_2010 2012-11-09
  • 打赏
  • 举报
回复
JDOM的addContent方法会检查文档结构,树结构中不能有循环 第个节点有且仅有一个根元素 Content类有个detach()方法,在添加content的时候调用一下该方法就好了.
logsElement.addContent(logsContentElement.detach())

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧