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结果进一步处理。
相关文章推荐
- Spring 总结XML配置的十二个最佳实践-Java基础-Java-编程开发
- java 读取文件最佳实践
- java文件读取的路径问题解惑和最佳实践,让你远离FileNotFoundException
- 转载--JAVA读取文件最佳实践
- java读取xml获得list并通过反射赋值给javabean
- java中使用xPath读取xml中的数据
- java_xml读取
- JAVA读取XML配置文件
- Java程序优化的一些最佳实践(转)
- java读取xml文件
- Java程序优化的一些最佳实践
- java读取xml配置文件(sax)
- Java 8里面lambda的最佳实践
- Java最佳实践
- Java中关于异常处理的十个最佳实践
- JAVA读取xml文件
- Java中的XML读取
- Android 和 Java 性能优化最佳实践
- java读取XML
- MS SQL SERVER2005 XML 最佳实践13