在java中XML解析最常使用的方法,超详细

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();

希望看完此篇能对你有帮助,谢谢,收藏以备用哦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值