- 浏览: 1589492 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
Dom4j节点处理器的实现
Dom4j为XML文档解析提供了强大的API支持,在实际开发中,为了处理方便,常常以节点元素(Element)为单位进行处理,并且结合数据库和Java技术,为节点生成ID属性。这样,就很有必要在Dom4j的基础上,重新封装一些适用需要的方法,以提高开发效率。下面是我利用业余时间做的一个Dom4j节点处理器工具类的实现。希望能节省开发人员宝贵时间。
说明:为了写起来方便,可以单独运行,我没有写单独的测试类,实际用的时候,删除掉测试main()和test()方法即可。
注释很详细,不用废话了。下面是处理器的实现:
测试用的xml:
输出三个测试对象
----------srcXml------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------nodeXml1------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------nodeXml2------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
处理器的实现类:
package com.topsoft.icib.common.utils;
import org.dom4j.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.lang.StringUtils;
import java.util.Random;
import java.util.Iterator;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-3-27 18:42:39<br>
* <b>Note</b>: XML节点处理器,包含XML元素的CRUD方法。
*/
public class XmlNodeHandler {
private static Log log = LogFactory.getLog(XmlNodeHandler.class);
/**
* 在xml的指定位置插入一个元素
*
* @param srcXml 原xml
* @param nodeXml 元素xml
* @param xpath 要插入元素父节点的位置
* @return 原xml插入节点后的完整xml文档
*/
public static String addElement(String srcXml, String nodeXml, String xpath) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document docNode = DocumentHelper.parseText(nodeXml);
Element parentElement = (Element) docSrc.getRootElement().selectSingleNode(xpath);
parentElement.add(docNode.getRootElement());
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("在文档" + xpath + "位置添加新节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中指定ID的元素
*
* @param srcXml 原xml
* @param xmlNodeId 元素ID属性值
* @return 删除元素后的xml文档
*/
public static String removeElementById(String srcXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Element removeElement = docSrc.getRootElement().elementByID(xmlNodeId);
removeElement.detach(); //直接删除自己
// removeElement.getParent().remove(removeElement); //从父节点删除子节点
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("删除文档中ID为" + xmlNodeId + "的节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中以xpath为直接父节点的ID属性为空的子节点,ID属性为空包括值为空、空串、或者ID属性不存在。
*
* @param srcXml 原xml文档
* @param xpath 要删除空节点的所在父节点的xpath
* @return 删除空节点后的xml文档
*/
public static String removeNullIdElement(String srcXml, String xpath) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(srcXml);
removeNullIdElement(srcDoc, xpath);
resultXml = srcDoc.asXML();
} catch (DocumentException e) {
log.error("在" + xpath + "下删除空节点发生异常,请检查xpath是否正确!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中以xpath为直接父节点的ID属性为空的子节点,ID属性为空包括值为空、空串、或者ID属性不存在。
*
* @param srcDoc 原xml的Document对象
* @param xpath 要删除空节点的所在父节点的xpath
* @return 删除空节点后的xml文档
*/
public static Document removeNullIdElement(Document srcDoc, String xpath) {
Node parentNode = srcDoc.getRootElement().selectSingleNode(xpath);
if (!(parentNode instanceof Element)) {
log.error("所传入的xpath不是Elementpath,删除空节点失败!");
} else {
int i = 0;
for (Iterator<Element> it = ((Element) parentNode).elementIterator(); it.hasNext();) {
Element element = it.next();
if (element.attribute("ID") == null) {
element.detach();
i++;
} else {
if (StringUtils.isBlank(element.attribute("ID").getValue())) {
element.detach();
i++;
}
}
}
log.info("在" + xpath + "下成功删除" + i + "了个空节点!");
}
return srcDoc;
}
/**
* 删除xml文档中指定xpath路径下所有直接子节点为空的节点
*
* @param srcXml 原xml文档
* @param xpathList xpaht列表
* @return 删除空节点后的xml文档
*/
public static String removeAllNullIdElement(String srcXml, ArrayList<String> xpathList) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(srcXml);
for (Iterator<String> it = xpathList.iterator(); it.hasNext();) {
String xpath = it.next();
removeNullIdElement(srcDoc, xpath);
}
resultXml = srcDoc.asXML();
} catch (DocumentException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 更新xml文档中指定ID的元素,ID保持不变
*
* @param srcXml 原xml
* @param newNodeXml 新xml节点
* @param xmlNodeId 更新元素ID属性值
* @return 更新元素后的xml文档
*/
public static String updateElementById(String srcXml, String newNodeXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document newDocNode = DocumentHelper.parseText(newNodeXml);
//获取要更新的目标节点
Element updatedNode = docSrc.elementByID(xmlNodeId);
//获取更新目标节点的父节点
Element parentUpNode = updatedNode.getParent();
//删除掉要更新的节点
parentUpNode.remove(updatedNode);
//获取新节点的根节点(作为写入节点)
Element newRoot = newDocNode.getRootElement();
//处理新节点的ID属性值和BS子元素的值
if (newRoot.attribute("ID") == null) {
newRoot.addAttribute("ID", xmlNodeId);
} else {
newRoot.attribute("ID").setValue(xmlNodeId);
}
//在原文档中更新位置写入新节点
parentUpNode.add(newRoot);
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("更新xml文档中ID为" + xmlNodeId + "节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 更新xml文档中指定ID的元素,并检查ID和BS,加以设置
*
* @param srcXml 原xml
* @param newNodeXml 新xml节点
* @param xmlNodeId 更新元素ID属性值
* @return 更新元素后的xml文档
*/
public static String updateElementByIdAddIdBs(String srcXml, String newNodeXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document newDocNode = DocumentHelper.parseText(newNodeXml);
//获取要更新的目标节点
Element updatedNode = docSrc.elementByID(xmlNodeId);
//获取更新目标节点的父节点
Element parentUpNode = updatedNode.getParent();
//删除掉要更新的节点
parentUpNode.remove(updatedNode);
//获取新节点的根节点(作为写入节点)
Element newRoot = newDocNode.getRootElement();
//处理新节点的ID属性值和BS子元素的值
if (newRoot.attribute("ID") == null) {
newRoot.addAttribute("ID", xmlNodeId);
} else {
newRoot.attribute("ID").setValue(xmlNodeId);
}
if (newRoot.element("BS") == null) {
newRoot.addElement("BS", xmlNodeId);
} else {
newRoot.element("BS").setText(xmlNodeId);
}
//在原文档中更新位置写入新节点
parentUpNode.add(newRoot);
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("更新xml文档中ID为" + xmlNodeId + "节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 为xml元素设置ID属性
*
* @param xmlElement 原xml元素
* @return 设置id后的xml串
*/
public static String addIdAttribute(String xmlElement) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(xmlElement);
Element root = srcDoc.getRootElement();
// Long nextValue = SequenceUtils.getSequeceNextValue();
Long nextValue = new Random().nextLong();
root.addAttribute("ID", nextValue.toString());
resultXml = root.asXML();
} catch (DocumentException e) {
log.error("给xml元素设置ID属性发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 为xml元素设置ID属性,并将此属性写入一个指定子节点文本值域
*
* @param xmlElement 原xml元素
* @param nodeName (直接)子节点的名称,或相对当前节点的xpath路径
* @return 设置id和子节点后的xml串
*/
public static String addIdAndWriteNode(String xmlElement, String nodeName) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(xmlElement);
Element root = srcDoc.getRootElement();
// Long nextValue = SequenceUtils.getSequeceNextValue();
Long nextValue = new Random().nextLong();
root.addAttribute("ID", nextValue.toString());
Node bsElement = root.selectSingleNode(nodeName);
if (bsElement instanceof Element && bsElement != null) {
bsElement.setText(nextValue.toString());
} else {
root.addElement(nodeName).setText(nextValue.toString());
}
resultXml = root.asXML();
} catch (DocumentException e) {
log.error("给xml元素设置ID属性和直接" + nodeName + "子元素值时发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
public static void main(String args[]) {
test();
}
public static void test() {
System.out.println("----------test()----------");
String srcXml = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
"<doc>\n" +
" <person>\n" +
" <name>某人</name>\n" +
" <adds>\n" +
" <add ID=\"10001\">\n" +
" <BS>10001</BS>\n" +
" <note>郑州市经三路</note>\n" +
" </add>\n" +
" <add ID=\"10002\">\n" +
" <BS>10002</BS>\n" +
" <note>西安市太白路</note>\n" +
" </add>\n" +
" <add ID=\"\">\n" +
" <BS>10002</BS>\n" +
" <note>空ID节点啊</note>\n" +
" </add>\n" +
" <add>\n" +
" <BS>10002</BS>\n" +
" <note>空ID节点啊</note>\n" +
" </add>\n" +
" </adds>\n" +
" </person>\n" +
" <other>\n" +
" <name ID=\"HEHE\">ASDF</name>\n" +
" <name>空ID节点啊</name>\n" +
" <name>空ID节点啊</name>\n" +
" </other>\n" +
"</doc>";
String nodeXml1 = " <add >\n" +
" <BS></BS>\n" +
" <note>西安市太白路1</note>\n" +
" </add>";
String nodeXml2 = " <add>\n" +
" <note>西安市太白路2</note>\n" +
" </add>";
// System.out.println("输出三个测试对象");
// System.out.println("----------srcXml------------");
// System.out.println(srcXml);
// System.out.println("----------nodeXml1------------");
// System.out.println(srcXml);
// System.out.println("----------nodeXml2------------");
// System.out.println(srcXml);
System.out.println("----------addElement()测试----------");
String addrs = addElement(srcXml, nodeXml1, "/doc/person/adds");
System.out.println(addrs);
System.out.println("----------addIdAttribute()测试----------");
String addIdrs = addIdAttribute(nodeXml1);
System.out.println(addIdrs);
System.out.println("----------addIdAndWriteNode()测试----------");
String addIdNoders = addIdAndWriteNode(nodeXml1, "BS");
System.out.println(addIdNoders);
System.out.println("----------removeElementById()测试----------");
String removeIdrs = removeElementById(srcXml, "10001");
System.out.println(removeIdrs);
System.out.println("----------updateElementByIdAddIdBs()测试----------");
String upbyidrs = updateElementByIdAddIdBs(srcXml, nodeXml2, "10001");
System.out.println(upbyidrs);
System.out.println("----------updateElementById()测试----------");
String upbyidrs1 = updateElementById(srcXml, nodeXml2, "10001");
System.out.println(upbyidrs1);
System.out.println("----------removeNullIdElement()测试----------");
String rvnullrs = removeNullIdElement(srcXml, "/doc/person/adds");
System.out.println(rvnullrs);
System.out.println("----------removeAllNullIdElement()测试----------");
ArrayList<String> xpathList = new ArrayList<String>();
xpathList.add("/doc/person/adds");
xpathList.add("/doc/other");
String rvallnullrs = removeAllNullIdElement(srcXml, xpathList);
System.out.println(rvallnullrs);
System.out.println("----------Dom4j生成一个xml测试----------");
Document doc = DocumentHelper.createDocument();
doc.addElement("root")
.addElement("person").setText("haha:)");
System.out.println(doc.asXML());
}
}
运行结果:
----------test()----------
----------addElement()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS/>
<note>西安市太白路1</note>
</add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------addIdAttribute()测试----------
<add ID="7549173897283584063">
<BS/>
<note>西安市太白路1</note>
</add>
----------addIdAndWriteNode()测试----------
<add ID="8974292836389323633">
<BS>8974292836389323633</BS>
<note>西安市太白路1</note>
</add>
----------removeElementById()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------updateElementByIdAddIdBs()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add ID="10001">
<note>西安市太白路2</note>
<BS xmlns="10001"/></add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------updateElementById()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add ID="10001">
<note>西安市太白路2</note>
</add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------removeNullIdElement()测试----------
16:17:32,689 INFO XmlNodeHandler:113 - 在/doc/person/adds下成功删除4了个空节点!
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------removeAllNullIdElement()测试----------
16:17:32,705 INFO XmlNodeHandler:113 - 在/doc/person/adds下成功删除4了个空节点!
16:17:32,705 INFO XmlNodeHandler:113 - 在/doc/other下成功删除3了个空节点!
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
</other>
</doc>
----------Dom4j生成一个xml测试----------
<?xml version="1.0" encoding="UTF-8"?>
<root><person>haha:)</person></root>
Process finished with exit code 0
程序中尽量避免用Dom4j之外的第三方类库,但是还用到了,可以修改一下:
1、用到Log4j的地方,可以修改log对象的实现为Java中的Logger工具:
private static Logger log = Logger.getLogger(XmlNodeHandler.class.getName());
2、用到apache的beanutils工具包中的StringUtils.isBlank()方法时候,可以改用JDK API String中的equel()方法做比较进行替换。具体操作很简单,我就不写了。
3、用到Sequence生成的Id的地方,我都改为java.util.Random类来实现,目的还是为了把眼光放到Dom的处理上。如果有博友对这个SequenceUtils工具类有兴趣,我可以把代码贴出去。
本处理器工具类涵盖Dom4j最常用部分80%以上的API。放到以方便查看。
Dom4j为XML文档解析提供了强大的API支持,在实际开发中,为了处理方便,常常以节点元素(Element)为单位进行处理,并且结合数据库和Java技术,为节点生成ID属性。这样,就很有必要在Dom4j的基础上,重新封装一些适用需要的方法,以提高开发效率。下面是我利用业余时间做的一个Dom4j节点处理器工具类的实现。希望能节省开发人员宝贵时间。
说明:为了写起来方便,可以单独运行,我没有写单独的测试类,实际用的时候,删除掉测试main()和test()方法即可。
注释很详细,不用废话了。下面是处理器的实现:
测试用的xml:
输出三个测试对象
----------srcXml------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------nodeXml1------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------nodeXml2------------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
处理器的实现类:
package com.topsoft.icib.common.utils;
import org.dom4j.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.lang.StringUtils;
import java.util.Random;
import java.util.Iterator;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-3-27 18:42:39<br>
* <b>Note</b>: XML节点处理器,包含XML元素的CRUD方法。
*/
public class XmlNodeHandler {
private static Log log = LogFactory.getLog(XmlNodeHandler.class);
/**
* 在xml的指定位置插入一个元素
*
* @param srcXml 原xml
* @param nodeXml 元素xml
* @param xpath 要插入元素父节点的位置
* @return 原xml插入节点后的完整xml文档
*/
public static String addElement(String srcXml, String nodeXml, String xpath) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document docNode = DocumentHelper.parseText(nodeXml);
Element parentElement = (Element) docSrc.getRootElement().selectSingleNode(xpath);
parentElement.add(docNode.getRootElement());
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("在文档" + xpath + "位置添加新节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中指定ID的元素
*
* @param srcXml 原xml
* @param xmlNodeId 元素ID属性值
* @return 删除元素后的xml文档
*/
public static String removeElementById(String srcXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Element removeElement = docSrc.getRootElement().elementByID(xmlNodeId);
removeElement.detach(); //直接删除自己
// removeElement.getParent().remove(removeElement); //从父节点删除子节点
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("删除文档中ID为" + xmlNodeId + "的节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中以xpath为直接父节点的ID属性为空的子节点,ID属性为空包括值为空、空串、或者ID属性不存在。
*
* @param srcXml 原xml文档
* @param xpath 要删除空节点的所在父节点的xpath
* @return 删除空节点后的xml文档
*/
public static String removeNullIdElement(String srcXml, String xpath) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(srcXml);
removeNullIdElement(srcDoc, xpath);
resultXml = srcDoc.asXML();
} catch (DocumentException e) {
log.error("在" + xpath + "下删除空节点发生异常,请检查xpath是否正确!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 删除xml文档中以xpath为直接父节点的ID属性为空的子节点,ID属性为空包括值为空、空串、或者ID属性不存在。
*
* @param srcDoc 原xml的Document对象
* @param xpath 要删除空节点的所在父节点的xpath
* @return 删除空节点后的xml文档
*/
public static Document removeNullIdElement(Document srcDoc, String xpath) {
Node parentNode = srcDoc.getRootElement().selectSingleNode(xpath);
if (!(parentNode instanceof Element)) {
log.error("所传入的xpath不是Elementpath,删除空节点失败!");
} else {
int i = 0;
for (Iterator<Element> it = ((Element) parentNode).elementIterator(); it.hasNext();) {
Element element = it.next();
if (element.attribute("ID") == null) {
element.detach();
i++;
} else {
if (StringUtils.isBlank(element.attribute("ID").getValue())) {
element.detach();
i++;
}
}
}
log.info("在" + xpath + "下成功删除" + i + "了个空节点!");
}
return srcDoc;
}
/**
* 删除xml文档中指定xpath路径下所有直接子节点为空的节点
*
* @param srcXml 原xml文档
* @param xpathList xpaht列表
* @return 删除空节点后的xml文档
*/
public static String removeAllNullIdElement(String srcXml, ArrayList<String> xpathList) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(srcXml);
for (Iterator<String> it = xpathList.iterator(); it.hasNext();) {
String xpath = it.next();
removeNullIdElement(srcDoc, xpath);
}
resultXml = srcDoc.asXML();
} catch (DocumentException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 更新xml文档中指定ID的元素,ID保持不变
*
* @param srcXml 原xml
* @param newNodeXml 新xml节点
* @param xmlNodeId 更新元素ID属性值
* @return 更新元素后的xml文档
*/
public static String updateElementById(String srcXml, String newNodeXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document newDocNode = DocumentHelper.parseText(newNodeXml);
//获取要更新的目标节点
Element updatedNode = docSrc.elementByID(xmlNodeId);
//获取更新目标节点的父节点
Element parentUpNode = updatedNode.getParent();
//删除掉要更新的节点
parentUpNode.remove(updatedNode);
//获取新节点的根节点(作为写入节点)
Element newRoot = newDocNode.getRootElement();
//处理新节点的ID属性值和BS子元素的值
if (newRoot.attribute("ID") == null) {
newRoot.addAttribute("ID", xmlNodeId);
} else {
newRoot.attribute("ID").setValue(xmlNodeId);
}
//在原文档中更新位置写入新节点
parentUpNode.add(newRoot);
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("更新xml文档中ID为" + xmlNodeId + "节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 更新xml文档中指定ID的元素,并检查ID和BS,加以设置
*
* @param srcXml 原xml
* @param newNodeXml 新xml节点
* @param xmlNodeId 更新元素ID属性值
* @return 更新元素后的xml文档
*/
public static String updateElementByIdAddIdBs(String srcXml, String newNodeXml, String xmlNodeId) {
String resultXml = null;
try {
Document docSrc = DocumentHelper.parseText(srcXml);
Document newDocNode = DocumentHelper.parseText(newNodeXml);
//获取要更新的目标节点
Element updatedNode = docSrc.elementByID(xmlNodeId);
//获取更新目标节点的父节点
Element parentUpNode = updatedNode.getParent();
//删除掉要更新的节点
parentUpNode.remove(updatedNode);
//获取新节点的根节点(作为写入节点)
Element newRoot = newDocNode.getRootElement();
//处理新节点的ID属性值和BS子元素的值
if (newRoot.attribute("ID") == null) {
newRoot.addAttribute("ID", xmlNodeId);
} else {
newRoot.attribute("ID").setValue(xmlNodeId);
}
if (newRoot.element("BS") == null) {
newRoot.addElement("BS", xmlNodeId);
} else {
newRoot.element("BS").setText(xmlNodeId);
}
//在原文档中更新位置写入新节点
parentUpNode.add(newRoot);
resultXml = docSrc.asXML();
} catch (DocumentException e) {
log.error("更新xml文档中ID为" + xmlNodeId + "节点发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 为xml元素设置ID属性
*
* @param xmlElement 原xml元素
* @return 设置id后的xml串
*/
public static String addIdAttribute(String xmlElement) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(xmlElement);
Element root = srcDoc.getRootElement();
// Long nextValue = SequenceUtils.getSequeceNextValue();
Long nextValue = new Random().nextLong();
root.addAttribute("ID", nextValue.toString());
resultXml = root.asXML();
} catch (DocumentException e) {
log.error("给xml元素设置ID属性发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
/**
* 为xml元素设置ID属性,并将此属性写入一个指定子节点文本值域
*
* @param xmlElement 原xml元素
* @param nodeName (直接)子节点的名称,或相对当前节点的xpath路径
* @return 设置id和子节点后的xml串
*/
public static String addIdAndWriteNode(String xmlElement, String nodeName) {
String resultXml = null;
try {
Document srcDoc = DocumentHelper.parseText(xmlElement);
Element root = srcDoc.getRootElement();
// Long nextValue = SequenceUtils.getSequeceNextValue();
Long nextValue = new Random().nextLong();
root.addAttribute("ID", nextValue.toString());
Node bsElement = root.selectSingleNode(nodeName);
if (bsElement instanceof Element && bsElement != null) {
bsElement.setText(nextValue.toString());
} else {
root.addElement(nodeName).setText(nextValue.toString());
}
resultXml = root.asXML();
} catch (DocumentException e) {
log.error("给xml元素设置ID属性和直接" + nodeName + "子元素值时发生异常,请检查!");
System.out.println(e.getMessage());
e.printStackTrace();
}
return resultXml;
}
public static void main(String args[]) {
test();
}
public static void test() {
System.out.println("----------test()----------");
String srcXml = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
"<doc>\n" +
" <person>\n" +
" <name>某人</name>\n" +
" <adds>\n" +
" <add ID=\"10001\">\n" +
" <BS>10001</BS>\n" +
" <note>郑州市经三路</note>\n" +
" </add>\n" +
" <add ID=\"10002\">\n" +
" <BS>10002</BS>\n" +
" <note>西安市太白路</note>\n" +
" </add>\n" +
" <add ID=\"\">\n" +
" <BS>10002</BS>\n" +
" <note>空ID节点啊</note>\n" +
" </add>\n" +
" <add>\n" +
" <BS>10002</BS>\n" +
" <note>空ID节点啊</note>\n" +
" </add>\n" +
" </adds>\n" +
" </person>\n" +
" <other>\n" +
" <name ID=\"HEHE\">ASDF</name>\n" +
" <name>空ID节点啊</name>\n" +
" <name>空ID节点啊</name>\n" +
" </other>\n" +
"</doc>";
String nodeXml1 = " <add >\n" +
" <BS></BS>\n" +
" <note>西安市太白路1</note>\n" +
" </add>";
String nodeXml2 = " <add>\n" +
" <note>西安市太白路2</note>\n" +
" </add>";
// System.out.println("输出三个测试对象");
// System.out.println("----------srcXml------------");
// System.out.println(srcXml);
// System.out.println("----------nodeXml1------------");
// System.out.println(srcXml);
// System.out.println("----------nodeXml2------------");
// System.out.println(srcXml);
System.out.println("----------addElement()测试----------");
String addrs = addElement(srcXml, nodeXml1, "/doc/person/adds");
System.out.println(addrs);
System.out.println("----------addIdAttribute()测试----------");
String addIdrs = addIdAttribute(nodeXml1);
System.out.println(addIdrs);
System.out.println("----------addIdAndWriteNode()测试----------");
String addIdNoders = addIdAndWriteNode(nodeXml1, "BS");
System.out.println(addIdNoders);
System.out.println("----------removeElementById()测试----------");
String removeIdrs = removeElementById(srcXml, "10001");
System.out.println(removeIdrs);
System.out.println("----------updateElementByIdAddIdBs()测试----------");
String upbyidrs = updateElementByIdAddIdBs(srcXml, nodeXml2, "10001");
System.out.println(upbyidrs);
System.out.println("----------updateElementById()测试----------");
String upbyidrs1 = updateElementById(srcXml, nodeXml2, "10001");
System.out.println(upbyidrs1);
System.out.println("----------removeNullIdElement()测试----------");
String rvnullrs = removeNullIdElement(srcXml, "/doc/person/adds");
System.out.println(rvnullrs);
System.out.println("----------removeAllNullIdElement()测试----------");
ArrayList<String> xpathList = new ArrayList<String>();
xpathList.add("/doc/person/adds");
xpathList.add("/doc/other");
String rvallnullrs = removeAllNullIdElement(srcXml, xpathList);
System.out.println(rvallnullrs);
System.out.println("----------Dom4j生成一个xml测试----------");
Document doc = DocumentHelper.createDocument();
doc.addElement("root")
.addElement("person").setText("haha:)");
System.out.println(doc.asXML());
}
}
运行结果:
----------test()----------
----------addElement()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS/>
<note>西安市太白路1</note>
</add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------addIdAttribute()测试----------
<add ID="7549173897283584063">
<BS/>
<note>西安市太白路1</note>
</add>
----------addIdAndWriteNode()测试----------
<add ID="8974292836389323633">
<BS>8974292836389323633</BS>
<note>西安市太白路1</note>
</add>
----------removeElementById()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------updateElementByIdAddIdBs()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add ID="10001">
<note>西安市太白路2</note>
<BS xmlns="10001"/></add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------updateElementById()测试----------
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
<add ID="">
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add>
<BS>10002</BS>
<note>空ID节点啊</note>
</add>
<add ID="10001">
<note>西安市太白路2</note>
</add></adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------removeNullIdElement()测试----------
16:17:32,689 INFO XmlNodeHandler:113 - 在/doc/person/adds下成功删除4了个空节点!
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
<name>空ID节点啊</name>
<name>空ID节点啊</name>
</other>
</doc>
----------removeAllNullIdElement()测试----------
16:17:32,705 INFO XmlNodeHandler:113 - 在/doc/person/adds下成功删除4了个空节点!
16:17:32,705 INFO XmlNodeHandler:113 - 在/doc/other下成功删除3了个空节点!
<?xml version="1.0" encoding="GBK"?>
<doc>
<person>
<name>某人</name>
<adds>
<add ID="10001">
<BS>10001</BS>
<note>郑州市经三路</note>
</add>
<add ID="10002">
<BS>10002</BS>
<note>西安市太白路</note>
</add>
</adds>
</person>
<other>
<name ID="HEHE">ASDF</name>
</other>
</doc>
----------Dom4j生成一个xml测试----------
<?xml version="1.0" encoding="UTF-8"?>
<root><person>haha:)</person></root>
Process finished with exit code 0
程序中尽量避免用Dom4j之外的第三方类库,但是还用到了,可以修改一下:
1、用到Log4j的地方,可以修改log对象的实现为Java中的Logger工具:
private static Logger log = Logger.getLogger(XmlNodeHandler.class.getName());
2、用到apache的beanutils工具包中的StringUtils.isBlank()方法时候,可以改用JDK API String中的equel()方法做比较进行替换。具体操作很简单,我就不写了。
3、用到Sequence生成的Id的地方,我都改为java.util.Random类来实现,目的还是为了把眼光放到Dom的处理上。如果有博友对这个SequenceUtils工具类有兴趣,我可以把代码贴出去。
本处理器工具类涵盖Dom4j最常用部分80%以上的API。放到以方便查看。
发表评论
-
JAVA 线程
2011-01-11 10:32 1282我们可以在计算机上运 ... -
WeakReference
2011-01-11 09:02 2378reachable, the following happen ... -
Java的多线程机制
2010-08-25 23:59 19085程序、进程和线程: ... -
Why would a static inner interface be used in Java?
2010-07-22 11:01 1531Q:I have just found a static in ... -
java中的深拷贝和浅拷贝
2010-07-22 10:58 1466做项目时,可能会碰到这样的一个问题,就是需要把一个对象的属性完 ... -
JAVA 反射
2010-07-22 10:41 1506反射:Class c = Class.forName (&qu ... -
Thinking in java inner classes
2010-07-21 09:44 1182Thinking in java inner cla ... -
1Java 的多重继承与内部类
2010-07-21 09:38 2408<!-- @pa ... -
java插入排序算法
2010-06-29 09:52 1403插入排序算法策略:排序值列中的前2个值,并在必要时交换它们。在 ... -
Java中的volatile关键字
2010-06-12 10:00 1203Java中的volatile关键字 ... -
java 数组排序后,倒过来
2010-01-29 20:11 2764public int[] sort() ... -
用java获取文件夹的大小
2010-01-29 20:09 9534用java获取文件夹的大小 ... -
JAVA移位运算符
2009-12-03 15:50 35644移位运算符就是在二进 ... -
java二进制,字节数组,字符,十六进制,BCD编码转换
2009-12-03 15:48 7417java二进制,字节数组,字符,十六进制,BCD编码转换 ... -
Java内存泄露
2009-02-02 12:02 1908一、问题的提出 Java的一个重要优点就是通过垃圾收集器(Ga ... -
Java 的反射机制基本理解
2008-12-04 17:55 1622Java 的反射机制是使其具有动态特性的非常关键的一种机制,也 ... -
JAVA基础(多线程Thread和Runnable的使用区别
2008-12-04 15:03 44254Runnable是Thread的接口,在大多数情况下“推荐用接 ... -
java解构造器
2008-11-27 10:14 1227解构造器 构造器和方法的区别 摘要 要学习Java,你 ... -
equalsbuilder 示例
2008-11-27 09:32 18791.判断是否为空(null),是则false 2.判断是否 ... -
InputStream,Reader,byte[]数据或字符串的内容拷贝到OutputStream或
2008-11-24 12:54 9143007-07-18 妙用Commons良药<一> ...
相关推荐
4. 可扩展性:DOM4J允许用户自定义解析策略和处理器,以满足特定需求。 5. 支持XML Schema和DTD:能够验证XML文档是否符合预定义的模式或规范。 接下来,DOM4J 2.0.0-ALPHA是后续的一个实验性版本,引入了一些新...
* NodeFilter:定义了在 dom4j 节点中产生的一个滤镜或谓词的行为。 * ProcessingInstruction:定义 XML 处理指令。 * Text:定义 XML 文本节点。 * Visitor:用于实现 Visitor 模式。 * XPath:在分析一个字符串后...
Jaxen提供了一种统一的API,支持多种XML处理器,包括DOM4J。 2. `dom4j-1.6.1.jar`:这是DOM4J的主要库文件,包含了处理XML的所有功能。这个版本1.6.1是DOM4J的一个稳定版本,提供了许多特性,如读写XML文件、构建...
《DOM4J:Java中的XML处理利器》 在Java编程中,XML(eXtensible Markup Language)作为一种数据交换和存储格式,广泛应用...通过深入理解和熟练运用DOM4J,开发者可以更好地驾驭XML世界,实现数据的灵活处理和传输。
8. **事件处理**:如果需要在解析或操作XML时执行某些动作,可以注册监听器或处理器,DOM4J提供了相应的API。 9. **高级功能**:包括命名空间管理、DTD处理、实体引用、XML Schema支持等进阶话题。 10. **性能优化...
16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行深度遍历,并在每个节点上执行特定的操作。 17. **XPath**: 提供了XPath表达式的查询能力,使得在复杂的数据结构中定位和提取数据变得更加容易。 #### 三、...
2. **XPath支持**:DOM4J实现了XPath语言,允许开发者通过简洁的表达式来查询XML文档中的节点,大大简化了对XML数据的查找和操作。 3. **Element和Attribute对象**:DOM4J提供了Element和Attribute类,它们封装了...
- **Document对象**:代表整个XML文档,是DOM4J的根节点。 - **Element对象**:表示XML文档中的元素,可以包含属性、文本和子元素。 - **Attribute对象**:用于存储元素的属性。 - **Text对象**:表示元素中的...
4. **事件驱动编程**:DOM4J支持事件驱动的XML解析,可以注册事件处理器来响应XML解析过程中的特定事件,如元素开始、结束、文本节点发现等。 5. **文档操作**:DOM4J提供了创建、修改和删除XML文档节点的功能,...
13. **NodeFilter**: 定义节点过滤器,用于在DOM4J节点上应用条件筛选。 14. **ProcessingInstruction**: 定义XML处理指令,用于给处理器传递指令。 15. **Text**: 表示XML文本节点,包含纯文本内容。 16. **Visitor...
13. **NodeFilter**: 定义在DOM4J节点中产生的一个过滤器或谓词的行为。 14. **ProcessingInstruction**: 定义XML处理指令。 15. **Text**: 定义XML文本节点。 16. **Visitor**: 用于实现访问者模式。 17. **XPath**...
在dom4j库中,SAX解析器实现了SAX2接口,提供了一种高效且节省内存的方式解析XML。以下是使用dom4j进行SAX解析的基本步骤: 1. **引入依赖**:在项目中添加dom4j库,通常通过Maven或Gradle构建工具添加对应的依赖。...
13. `org.dom4j.ProcessingInstruction`: 定义XML处理指令,用于指导处理器如何处理文档的某些部分。 14. `org.dom4j.Text`: 代表XML的文本节点。 15. `org.dom4j.Visitor`: 实现Visitor模式,允许对XML树进行深度...
10. **Node**:`Node`是DOM4j中所有XML节点的基类,提供了统一的访问和操作方法,包括元素、属性、文本、注释等。 11. **NodeFilter**:`NodeFilter`定义了一个过滤器接口,允许你在遍历DOM4j树时根据特定条件筛选...
8. **事件处理**:DOM4J允许注册事件处理器,可以监听XML解析过程中的特定事件,如开始解析、遇到元素、结束解析等。 9. **性能优化**:DOM4J在设计时考虑了性能,例如通过延迟加载(lazy loading)减少内存占用,...
DOM4J支持SAX事件处理,允许在解析XML时触发自定义的事件处理器。这在处理大量数据时非常有用,可以及时处理数据而无需等待整个文档解析完成。 6. **与JAXB和JDOM的比较** DOM4J相较于JAXB(Java Architecture ...