<?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())
------其他解决方案--------------------------------------------------------
非常感谢,我加了detach()方法后,的确追加了,也不报错了,但效果却是这个样子的
<?xml version="1.0" encoding="UTF-8"?>
<explogs xmlns="http://java.sun.com/xml/ns/javaee">
<logs xmlns="" id="1">
<content>张三</content>