java读取xml的比较好的实践

本文通过两种方式探讨了如何从XML文件中提取数据,并将其转换为JSON格式或字符串形式,旨在对比不同处理方法的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务开发过程中,总免不了要读取xml文件内容,有的代码写的很优雅,有的就很繁琐,没有对比就没有伤害,接下来就分别探究下这两种方式的区别,希望能帮助到你。

1.待处理的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<BusinessData>
	<PersonnelDept type='1' info='1'>
		<data No='1000' salary='17900' gender='0' />
		<data No='1001' salary='17900' gender='0' />
		<data No='1002' salary='15800' gender='0' />
		<data No='1003' salary='15000' gender='0' />
		<data No='1004' salary='14300' gender='0' />
		<data No='1085' salary='89200' gender='1' />
	</PersonnelDept>

	<SalesDept type='1' info='2'>
		<data No='1006' salary='7900' gender='0' />
		<data No='1007' salary='7900' gender='1' />
		<data No='1008' salary='5800' gender='0' />
		<data No='1009' salary='5000' gender='0' />
		<data No='1010' salary='4300' gender='0' />
		<data No='1011' salary='9200' gender='1' />
	</SalesDept>

	<RDDept type='1' info='3'>
		<data No='1012' salary='71900' gender='1' />
		<data No='1013' salary='72900' gender='1' />
		<data No='1014' salary='58300' gender='1' />
		<data No='1015' salary='50400' gender='1' />
		<data No='1016' salary='42300' gender='1' />
		<data No='1017' salary='91200' gender='1' />
	</RDDept>
</BusinessData>

2.处理方式一:xml转json

  • XmlToJson.java

package com.wsc.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.wsc.util.ReadXML;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


public class XmlToJson {
    //读取xml文件
    public static JSONArray readXml() { 
        Document doc = ReadXML.getDoc("business.xml");
        NodeList roots = doc.getElementsByTagName("BusinessData");
        List<Map<String,String>> personnelDeptlist=null,salesDeptlist=null,rDDeptlist=null;
        
        if (roots.getLength() != 0) {
            Element root = (Element) roots.item(0);
            NodeList parameters = root.getChildNodes();
            // map保存灵活的参数
            for (int i = 0; i < parameters.getLength(); i++) {
                Node node = parameters.item(i);
                String nodeName=node.getNodeName();
                if("PersonnelDept".equals(nodeName)){//根节点BusinessData下的一个子节点
                    personnelDeptlist=readNode("PersonnelDept",node);
                 }else if("SalesDept".equals(nodeName)){//根节点BusinessData下的一个子节点
                     salesDeptlist=readNode("SalesDept",node);
                 }else if("RDDept".equals(nodeName)){//根节点BusinessData下的一个子节点
                     rDDeptlist=readNode("RDDept",node);
                 }    
            }
        }
        
      //解析list
     JSONArray  jsonArr=readList(personnelDeptlist,salesDeptlist,rDDeptlist);
     return jsonArr; 
    }
    
    //解析子节点
    public static List<Map<String,String>> readNode(String type,Node node){
        List<Map<String,String>> list=new ArrayList<Map<String,String>>();
        Map<String,String> map=null;
             NamedNodeMap attrs = node.getAttributes();
                for (int i = 0; i < attrs.getLength(); i++) {
                    Node attr = attrs.item(i);
                    if("type".equals(attr.getNodeName()) && "1".equals(attr.getNodeValue())){//获取节点的属性
                        NodeList childNodes = node.getChildNodes();
                        for (int j = 0; j < childNodes.getLength(); j++) {//遍历link节点
                            if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                                NamedNodeMap attrs1 = childNodes.item(j).getAttributes();
                                map=new HashMap<String,String>();
                                for (int k = 0; k < attrs1.getLength(); k++) {//遍历data节点的属性和值
                                     Node attr1 = attrs1.item(k);
                                     map.put(attr1.getNodeName(),attr1.getNodeValue());
                                } 
                                list.add(map);   
                           }
                      }
                   }
                }
              return list;
            }
    
    //解析字符串
    public static JSONArray readList(List<Map<String,String>> personnelDeptlist,List<Map<String,String>> salesDeptlist,List<Map<String,String>> rDDeptlist){
            JSONArray JsonArr = new JSONArray();
            JSONObject json=null;
        for(int i=0,len=personnelDeptlist.size();i<len;i++){
            json=new JSONObject();
            json=readJSON(json,personnelDeptlist.get(i));
            json=readJSON(json,salesDeptlist.get(i));
            json=readJSON(json,rDDeptlist.get(i));
            JsonArr.add(json);
        }       
        return JsonArr;
    }   

    // 解析map        
    public static JSONObject readJSON(JSONObject json,Map<String,String> map){
        for (Map.Entry<String,String> entry : map.entrySet()) {
            json.put(entry.getKey(), entry.getValue());
            }
        return json;
        }
  
    public static void main(String[] args) {
        JSONArray json=readXml();
        System.out.println(json);
    }

}
  • 结果

[
    {
        "gender": "1", 
        "salary": "71900", 
        "No": "1012"
    }, 
    {
        "gender": "1", 
        "salary": "72900", 
        "No": "1013"
    }, 
    {
        "gender": "1", 
        "salary": "58300", 
        "No": "1014"
    }, 
    {
        "gender": "1", 
        "salary": "50400", 
        "No": "1015"
    }, 
    {
        "gender": "1", 
        "salary": "42300", 
        "No": "1016"
    }, 
    {
        "gender": "1", 
        "salary": "91200", 
        "No": "1017"
    }
]

3.处理方式二:xml转string

  • XmlToString.java

package com.wsc.dao;

import com.wsc.util.ReadXML;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.parser.XmlTreeBuilder;
import org.jsoup.select.Elements;



public class XmlToString {
    //读取xml文件
    public static StringBuffer readXml() { 
        StringBuffer sb = new StringBuffer();
        String str = ReadXML.getFile("business.xml");
        Parser Parser = new Parser(new XmlTreeBuilder());
        Document parse = Jsoup.parse(str, "", Parser);
        sb.append(getNodeContent(parse,"PersonnelDept"));
        sb.append("$");
        sb.append(getNodeContent(parse,"SalesDept"));
        sb.append("$");
        sb.append(getNodeContent(parse,"RDDept"));
        return sb; 
    }
  //获取内容
  public static  StringBuffer getNodeContent(Document parse,String tagName) {
      StringBuffer sb = new StringBuffer();
      Elements detailTime = parse.getElementsByTag(tagName);
      Element a = detailTime.get(0);
      Elements a0 = a.getElementsByTag("data");
      for (Element a00 : a0) {
          sb.append(a00.attr("No") + "#" + a00.attr("salary") + "#" + a00.attr("gender")  + "@");
      }
      return sb;
  }
  
    public static void main(String[] args) {
       
        System.out.println(readXml());
    }

}
  • 结果

1000#17900#0@1001#17900#0@1002#15800#0@1003#15000#0@1004#14300#0@1085#89200#1@$1006#7900#0@1007#7900#1@1008#5800#0@1009#5000#0@1010#4300#0@1011#9200#1@$1012#71900#1@1013#72900#1@1014#58300#1@1015#50400#1@1016#42300#1@1017#91200#1@

4.总结

第一种方式是按照xml的dom解析的方式,好处是直接得到json结果,坏处是性能不佳,代码复杂,第二种方式使用jsoup解析,好处的代码简洁,坏处是需要对string结果进一步处理。

具体完整代码地址

​​​​​​​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值