java中XML解析最常见使用的方法:给不经常解析XML的java程序猿点一盏明灯
示例XML报文:
<RequestMsg>
<AAA>
<BBB>
<CCC>
<ACCEPT_STAFF_NAME>大雄</ACCEPT_STAFF_NAME>
<HELPER_NAME/>
<CO_SEQ>1</CO_SEQ>
<CUST_CRT_DATE>20210112205908</CUST_CRT_DATE>
<CUST_TYPE OLD = "123">1100</CUST_TYPE>
</CCC>
<CCC>
<ACCEPT_STAFF_NAME>胖虎</ACCEPT_STAFF_NAME>
<HELPER_NAME/>
<CO_SEQ>1</CO_SEQ>
<CUST_CRT_DATE>20210112205908</CUST_CRT_DATE>
<CUST_TYPE OLD = "456">1100</CUST_TYPE>
</CCC>
<CCC>
<ACCEPT_STAFF_NAME>静香</ACCEPT_STAFF_NAME>
<HELPER_NAME/>
<CO_SEQ>1</CO_SEQ>
<CUST_CRT_DATE>20210112205908</CUST_CRT_DATE>
<CUST_TYPE OLD = "789">1100</CUST_TYPE>
</CCC>
</BBB>
<DDD SHOW="这是悲伤的故事">3</DDD>
</AAA>
</RequestMsg>
1.String类型的XML转化为document对象
import org.dom4j.*;
//String转换CRM节点报文
String xmlStr = "此处放入要转换的xml字符串";
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlStr);
} catch (DocumentException e) {
System.out.println("String转换CRM节点报文异常");
}
2、从XML中取出特定的节点
a.如果你要获取的节点在最开始的xml转化的document对象中只出现了一次,或者出现多次但是你只想取第一个
Node nodeCCC = doc.selectSingleNode("RequestMsg/AAA/BBB/CCC");
b.如果你要获取的节点在document对象中出现了多次(多个重复节点名称)
List<Node> nodeCCCList = doc.selectNodes("RequestMsg/AAA/BBB/CCC");
//或者这样写,路径前面用//,直接写你想得到的节点名
List<Node> nodeCCCList = doc.selectNodes("//CCC");
此处取出的是个节点集合,要进一步从集合中取节点,要先进行集合遍历,见3中node集合遍历取值
3.从XML中取出特定节点的值;取特定节点的属性值
a.从document对象取出特定节点的值,此节点唯一
举例:
String dddValue = IOMUtils.getNodeValue(doc, "RequestMsg/AAA/DDD");
需要注意的是此处取节点值的路径的开始为doc的根节点,即是当前对象的根节点
b.从document对象取出特定节点的属性的值,此节点唯一
String showValue = IOMUtils.getNodeValue(doc, "RequestMsg/AAA/DDD/@SHOW");
c.从document对象取出特定节点的值和特定节点的属性值,此节点有多个
//先从document中取出该重复的节点,返回一个节点集合,再进行集合遍历
List<Node> nodeCCCList = doc.selectNodes("RequestMsg/AAA/BBB/CCC");
for (Iterator<Node> nodeCCC = nodeCCCList.iterator(); nodeCCC.hasNext(); ) {
//循环获取到每个CCC节点
Node nodeCCCOne = nodeCCC.next();
//获取CCC节点下的CUST_TYPE节点的值
String custTypeVal = IOMUtils.getNodeValue(nodeCCCOne, "CUST_TYPE");
//获取CCC节点下的CUST_TYPE节点的属性OLD的值
String custTypeOldVal = IOMUtils.getNodeValue(nodeCCCOne, "CUST_TYPE/@OLD");
}
//需要注意的是此处获取节点值和属性值,是从当前的nodeCCCOne节点里获取的,注意不要写成doc节点,路径是从节点CCC中的节点开始的
IOMUtils是工具类,其中getNodeValue方法如下:
public static String getNodeValue(Node parent, String childNodepath) {
Node childNode = null;
String value = null;
try {
childNode = parent.selectSingleNode(childNodepath);
value = trim(childNode.getText());
} catch (Exception e) {
return null;
}
return value;
}
public static String trim(String str) {
return str == null ? null : str.trim();
}
4.给特定的XML节点下添加节点,再给新加节点赋值(节点置空,此处赋值空字符串),给新加节点再加属性并且给属性赋值
//给DDD节点新增一个TEST节点
//先获取DDD节点
Element nodeDDD = (Element)doc.selectSingleNode("RequestMsg/AAA/DDD");
//给DDD节点添加一个TEST节点
Element testNode = nodeDDD.addElement("TEST");
//给TEST节点赋值
testNode.setText(String.valueOf("他们生活在一起"));
//给TEST节点添加一个SHOW的属性并对其赋值
testNode.addAttribute("SHOW", "很开心");
5.移除XML中某些特定节点
//此处应注意的是,节点的移除只能是从父节点移除子节点,所以首先我们应该先获取父节点
//此处我们想要移除ACCEPT_STAFF_NAME的值为"胖虎"的CCC节点
//首先我们应该从document对象中找出ACCEPT_STAFF_NAME的值为"胖虎"的CCC节点
//要删除的节点的集合,用于存放我们要移除的CCC节点(包括CCC节点和其所以子节点)
List<Element> list = new ArrayList();
//获取到所以CCC节点
List<Node> nodeCCCList = doc.selectNodes("RequestMsg/AAA/BBB/CCC");
for (Iterator<Node> nodeCCC = nodeCCCList.iterator(); nodeCCC.hasNext(); ) {
//循环获取到每个CCC节点
Node nodeCCCOne = nodeCCC.next();
//获取CCC节点下的ACCEPT_STAFF_NAME节点的值
String naemVal = IOMUtils.getNodeValue(nodeCCCOne, "ACCEPT_STAFF_NAME");
if("胖虎".equals(naemVal)){
list.add(nodeCCCOne);
}
}
//获取到CCC的父节点BBB
Element elementBBB = (Element) doc.selectSingleNode("RequestMsg/AAA/BBB");
for (int i = 0; i < list.size() ; i++) {
boolean remove = elementBody.remove(list.get(i));
System.out.println("是否移除成功 "+remove+" 移除的当前节点值为 "+list.get(i));
}
System.out.println("保留的报文为" + doc.asXML());
//document 转 XML
StringWriter writer = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlwriter = new XMLWriter(writer, format);
try {
xmlwriter.write(doc);
} catch (Exception e) {
e.printStackTrace();
}
return writer.toString();
6.document对象转成XML字符串
//String转换CRM节点报文
String xmlStr = "此处放入要转换的xml字符串";
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlStr);
} catch (DocumentException e) {
System.out.println("String转换CRM节点报文异常");
}
//此处省略两千行代码解析操作XML
//document 转 XML
StringWriter writer = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlwriter = new XMLWriter(writer, format);
try {
xmlwriter.write(doc);
} catch (Exception e) {
e.printStackTrace();
}
return writer.toString();
希望看完此篇能对你有帮助,谢谢,收藏以备用哦。