三句代码解析xml

Posted 北斗大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三句代码解析xml相关的知识,希望对你有一定的参考价值。

  作为一个java程序员,某天我们接到一个任务,要求将xml文件解析可使用的java对象,或者接口传输的数据并不是json而是以xml格式传输过来。那么,做为萌新程序员的你做的第一件事是什么,,去百度还是去Google,这是一个艰难的问题。

  如果你艰难的做出了决定,选择了其中一个。那么我说第一步你做错了,你应该先去看程序中是否已经解析过xml,然后将代码拿出来参考和修改,程序改改就好。

  假设你在做的项目里之前并没有做过解析xml,你的同事比你还萌新的时候,少年赶快去百度。打开网页后你会发现所有网页都是一样的内容------ Java解析xml四种方法、DOMSAXJDOMDOM4j,另外还有一个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.             //获取第ibook结点  

42.             org.w3c.dom.Node node = bookList.item(i);  

43.             //获取第ibook的所有属性  

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的主要内容,如果未能解决你的问题,请参考以下文章

在java中用啥方法解析xml能过滤掉回车,换行符等!!!!!!????求代码!!!

Android 之XML数据解析—— SAX解析

如何在 python 代码中解析多个 xml 文件?

XStream解析xml代码

在 C# 代码中解析(大)XML 的最佳方法是啥?

Java XML解析