您的位置:首页 > 编程语言 > Java开发

java读取xml的最佳实践

2018-07-19 19:21 866 查看

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

1.待处理的xml文件

[code]<?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

[code]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);
}

}
  • 结果

[code][
{
"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

[code]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());
}

}
  • 结果

[code]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结果进一步处理。

具体完整代码地址

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: