三句代码解析xml
Posted 北斗大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三句代码解析xml相关的知识,希望对你有一定的参考价值。
作为一个java程序员,某天我们接到一个任务,要求将xml文件解析可使用的java对象,或者接口传输的数据并不是json而是以xml格式传输过来。那么,做为萌新程序员的你做的第一件事是什么,,去百度还是去Google,这是一个艰难的问题。
如果你艰难的做出了决定,选择了其中一个。那么我说第一步你做错了,你应该先去看程序中是否已经解析过xml,然后将代码拿出来参考和修改,程序改改就好。
假设你在做的项目里之前并没有做过解析xml,你的同事比你还萌新的时候,少年赶快去百度。打开网页后你会发现所有网页都是一样的内容------ Java解析xml的四种方法、DOM、SAX、JDOM、DOM4j,另外还有一个xPath,但不是主流。
经过你的研究和分析觉得DOM4j这个方法最好用(其实还是网页内的推荐)。于是你照着网页代码写了一遍解析xml,觉得很好用,完美的完成了任务,顿时觉得生活美哒哒的,我copy了一个小的xml文档以及DOM4j的解析方式:
Xml文件:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <bookstore>
3. <book id="1">
4. <name>冰与火之歌</name>
5. <author>乔治马丁</author>
6. <year>2014</year>
7. <price>89</price>
8. </book>
9. <book id="2">
10. <name>安徒生童话</name>
11. <author>安徒生</author>
12. <year>2004</year>
13. <price>77</price>
14. </book>
15. <book id="3">
16. <name>think think think</name>
17. <author>aaa</author>
18. <year>1997</year>
19. <price>100</price>
20. </book>
21. </bookstore>
Java代码:
1. public class Book {
2.
3. /**
4. * @author lune
5. */
6.
7. private int id;
8. private String name;
9. private String author;
10. private int year;
11. private double price;
12.
13. /**
14. * @return the id
15. */
16. public int getId() {
17. return id;
18. }
19. /**
20. * @param id the id to set
21. */
22. public void setId(int id) {
23. this.id = id;
24. }
25. /**
26. * @return the name
27. */
28. public String getName() {
29. return name;
30. }
31. /**
32. * @param name the name to set
33. */
34. public void setName(String name) {
35. this.name = name;
36. }
37. /**
38. * @return the author
39. */
40. public String getAuthor() {
41. return author;
42. }
43. /**
44. * @param author the author to set
45. */
46. public void setAuthor(String author) {
47. this.author = author;
48. }
49. /**
50. * @return the year
51. */
52. public int getYear() {
53. return year;
54. }
55. /**
56. * @param year the year to set
57. */
58. public void setYear(int year) {
59. this.year = year;
60. }
61. /**
62. * @return the price
63. */
64. public double getPrice() {
65. return price;
66. }
67. /**
68. * @param price the price to set
69. */
70. public void setPrice(double price) {
71. this.price = price;
72. }
73.
74. @Override
75. public String toString() {
76. return "Book [id=" + id + ", name=" + name + ", author=" + author + ", year=" + year + ", price=" + price + "]";
77. }
78.
79. }
DOM方式解析XML
[java] view plain copy
1. import java.util.ArrayList;
2. import java.util.List;
3.
4. import javax.xml.parsers.DocumentBuilder;
5. import javax.xml.parsers.DocumentBuilderFactory;
6. import javax.xml.parsers.ParserConfigurationException;
7.
8. import org.w3c.dom.Document;
9. import org.w3c.dom.NamedNodeMap;
10. import org.w3c.dom.NodeList;
11.
12. import com.lune.bean.Book;
13.
14. /**
15. * 用DOM方式读取xml文件
16. * @author lune
17. */
18. public class ReadxmlByDom {
19. private static DocumentBuilderFactory dbFactory = null;
20. private static DocumentBuilder db = null;
21. private static Document document = null;
22. private static List<Book> books = null;
23. static{
24. try {
25. dbFactory = DocumentBuilderFactory.newInstance();
26. db = dbFactory.newDocumentBuilder();
27. } catch (ParserConfigurationException e) {
28. e.printStackTrace();
29. }
30. }
31.
32. public static List<Book> getBooks(String fileName) throws Exception{
33. //将给定 URI 的内容解析为一个 XML 文档,并返回Document对象
34. document = db.parse(fileName);
35. //按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList
36. NodeList bookList = document.getElementsByTagName(”book”);
37. books = new ArrayList<Book>();
38. //遍历books
39. for(int i=0;i<bookList.getLength();i++){
40. Book book = new Book();
41. //获取第i个book结点
42. org.w3c.dom.Node node = bookList.item(i);
43. //获取第i个book的所有属性
44. NamedNodeMap namedNodeMap = node.getAttributes();
45. //获取已知名为id的属性值
46. String id = namedNodeMap.getNamedItem(”id”).getTextContent();//System.out.println(id);
47. book.setId(Integer.parseInt(id));
48.
49. //获取book结点的子节点,包含了Test类型的换行
50. NodeList cList = node.getChildNodes();//System.out.println(cList.getLength());9
51.
52. //将一个book里面的属性加入数组
53. ArrayList<String> contents = new ArrayList<>();
54. for(int j=1;j<cList.getLength();j+=2){
55.
56. org.w3c.dom.Node cNode = cList.item(j);
57. String content = cNode.getFirstChild().getTextContent();
58. contents.add(content);
59. //System.out.println(contents);
60. }
61.
62. book.setName(contents.get(0));
63. book.setAuthor(contents.get(1));
64. book.setYear(Integer.parseInt(contents.get(2)));
65. book.setPrice(Double.parseDouble(contents.get(3)));
66. books.add(book);
67. }
68.
69. return books;
70.
71. }
72.
73. public static void main(String args[]){
74. String fileName = ”src/res/books.xml”;
75. try {
76. List<Book> list = ReadxmlByDom.getBooks(fileName);
77. for(Book book :list){
78. System.out.println(book);
79. }
80. } catch (Exception e) {
81. // TODO Auto-generated catch block
82. e.printStackTrace();
83. }
84. }
85.
86. }
在我标红色的代码里是取数的关键,之后数据如何使用来源于此。此时你做完了解析,但我提了一个新任务给你,此时还是这个xml,只是某个<book>标签中缺失了<year>2004</year>这个字段 ,注意是某个而非所有,此时你获取字段的方式已经不能用get 0 ,1,2,3,4的方式了,你需要先和字段名进行匹配,再赋值,这时程序的健壮性有所提升。
此时,我再提了一个不同的xml给你,萌新的你只能再写一个解析程序,因为前面的字段和新的字段不匹配啊。你只能针对每个类型的xml各自写一个对应的解析程序。
难道就没有一个解析程序能解析所有的xml吗?
当然是有的,只是你在各种浏览器中搜索“xml解析”,都只会得到DOM4j。是不是想死的心都有了是不是。
在浏览器搜索“jox解析xml”,你会发现解析xml ,so easy!经理再也不用担心我的开发进度了。。。。。。
FileInputStream in = new FileInputStream("bean.xml");
JOXBeanInputStream joxIn = new JOXBeanInputStream(in);
TestBean testBean = (TestBean) joxIn.readObject(
TestBean.class);
只有3句代码,解析任何类型的xml。
这是一个工具类,包装了解析方法,其内核还是DOM4j,前面的搜索并没有骗你,只是不加jox你永远搜不到。。。。。。。。。。。
以上是关于三句代码解析xml的主要内容,如果未能解决你的问题,请参考以下文章