zoukankan      html  css  js  c++  java
  • java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml

    JDK1.5需要添加jar包,1.6以后就不需要了
    <dependency> <groupId>stax</groupId> <artifactId>stax-api</artifactId> <version>1.0.1</version> </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.12</version>
    </dependency>

    JAXB:JAXB 的全名是Java ™ Architecture for XML Binding

    Classroom.java

     1 public class Classroom {
     2     private int id;
     3     private String name;
     4     private int grade;
     5 
     6     public Classroom() {
     7         super();
     8         // TODO Auto-generated constructor stub
     9     }
    10 
    11     public Classroom(int id, String name, int grade) {
    12         super();
    13         this.id = id;
    14         this.name = name;
    15         this.grade = grade;
    16     }
    17 
    18     public int getId() {
    19         return id;
    20     }
    21 
    22     public void setId(int id) {
    23         this.id = id;
    24     }
    25 
    26     public String getName() {
    27         return name;
    28     }
    29 
    30     public void setName(String name) {
    31         this.name = name;
    32     }
    33 
    34     public int getGrade() {
    35         return grade;
    36     }
    37 
    38     public void setGrade(int grade) {
    39         this.grade = grade;
    40     }
    41 
    42     @Override
    43     public String toString() {
    44         // TODO Auto-generated method stub
    45         return String.format("id:%d, name:%s, grade:%d", this.id, this.name, this.grade);
    46     }
    47 }

    Student.java

     1 @XmlRootElement
     2 public class Student {
     3     public int getId() {
     4         return id;
     5     }
     6 
     7     public void setId(int id) {
     8         this.id = id;
     9     }
    10 
    11     public String getName() {
    12         return name;
    13     }
    14 
    15     public void setName(String name) {
    16         this.name = name;
    17     }
    18 
    19     public int getAge() {
    20         return age;
    21     }
    22 
    23     public void setAge(int age) {
    24         this.age = age;
    25     }
    26 
    27     public Classroom getClassroom() {
    28         return classroom;
    29     }
    30 
    31     public void setClassroom(Classroom classroom) {
    32         this.classroom = classroom;
    33     }
    34 
    35     private int id;
    36     private String name;
    37     private int age;
    38     private Classroom classroom;
    39 
    40     public Student() {
    41         super();
    42         // TODO Auto-generated constructor stub
    43     }
    44 
    45     public Student(int id, String name, int age, Classroom classroom) {
    46         super();
    47         this.id = id;
    48         this.name = name;
    49         this.age = age;
    50         this.classroom = classroom;
    51     }
    52 
    53     @Override
    54     public String toString() {
    55         // TODO Auto-generated method stub
    56         return String.format("id:%d, name:%s, Classroom=>%s", this.id, this.name, this.classroom.toString());
    57     }
    58 }

    main方法:

     1 public static void main(String[] args) throws JAXBException {
     2         Student student = new Student(1, "大帅哥", 34, new Classroom(1, "计算机", 1));
     3         JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
     4         Marshaller marshaller = jaxbContext.createMarshaller();
     5         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //格式化输出
     6         marshaller.marshal(student, System.out);
     7         StringWriter stringWriter = new StringWriter();
     8         marshaller.marshal(student, stringWriter);
     9         String xml = stringWriter.toString();
    10         Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    11         student = (Student) unmarshaller.unmarshal(new StringReader(xml));
    12         System.out.println(student.toString());
    13     }

    STAX:StAX是Streaming API for XML的缩写,是一种针对XML的流式拉分析API。

    使用XMLStreamReader和XMLEventReader读取XML文件

     1     <?xml version="1.0" encoding="UTF-8"?>  
     2     <company>  
     3         <depart title="Develop Group">  
     4             <user name="Tom" age="28" gender="male" >Manager</user>  
     5             <user name="Lily" age="26" gender="female" />  
     6         </depart>  
     7         <depart title="Test Group">  
     8             <user name="Frank" age="32" gender="male" >Team Leader</user>  
     9             <user name="Bob" age="45" gender="male" />  
    10             <user name="Kate" age="25" gender="female" />  
    11         </depart>  
    12     </company>  

    JAVA代码

      1 // 获得Stream解析器(指针读取器对象)
      2     public static XMLStreamReader getStreamReader() {
      3         XMLStreamReader reader = null;
      4         String xmlFile = App.class.getResource("/").getFile() + "users.xml";
      5         XMLInputFactory factory = XMLInputFactory.newInstance();
      6         try {
      7             reader = factory.createXMLStreamReader(new FileReader(xmlFile));
      8         } catch (FileNotFoundException e) {
      9             e.printStackTrace();
     10         } catch (XMLStreamException e) {
     11             e.printStackTrace();
     12         }
     13         return reader;
     14     }
     15 
     16     // 获得Stream解析器(指针读取器对象),过滤器
     17     public static XMLStreamReader getStreamReader(StreamFilter streamFilter) {
     18         // 创建基于迭代器的指针读取器对象
     19         XMLStreamReader filterReader = null;
     20         String xmlFile = App.class.getResource("/").getFile() + "users.xml";
     21         XMLInputFactory factory = XMLInputFactory.newInstance();
     22         try {
     23             XMLStreamReader reader = factory.createXMLStreamReader(new FileReader(xmlFile));
     24             filterReader = factory.createFilteredReader(reader, streamFilter);
     25         } catch (FileNotFoundException e) {
     26             e.printStackTrace();
     27         } catch (XMLStreamException e) {
     28             e.printStackTrace();
     29         }
     30         return filterReader;
     31     }
     32 
     33     // 列出所有用户名称
     34     public static void listNames() {
     35         // 创建基于迭代器的指针读取器对象
     36         XMLStreamReader reader = App.getStreamReader();
     37         // 遍历XML文档
     38         try {
     39             while (reader.hasNext()) {
     40                 int event = reader.next();
     41                 // 如果是元素的开始
     42                 if (event == XMLStreamConstants.START_ELEMENT) {
     43                     // 列出所有用户名称
     44                     if ("user".equalsIgnoreCase(reader.getLocalName())) {
     45                         System.out.println("Name:" + reader.getAttributeValue(null, "name"));
     46                     }
     47                 }
     48             }
     49             reader.close();
     50         } catch (XMLStreamException e) {
     51             e.printStackTrace();
     52         }
     53     }
     54 
     55     public static void listNamesAndAges() {
     56         XMLStreamReader reader = App.getStreamReader();
     57         try {
     58             while (reader.hasNext()) {
     59                 // 跳过所有空白、注释或处理指令,到下一个START_ELEMENT
     60                 int event = reader.nextTag();
     61                 if (event == XMLStreamConstants.START_ELEMENT) {
     62                     if ("user".equalsIgnoreCase(reader.getLocalName())) {
     63                         System.out.println("Name:" + reader.getAttributeValue(null, "name") + ";Age:" + reader.getAttributeValue(null, "age"));
     64                     }
     65                 }
     66             }
     67             reader.close();
     68         } catch (XMLStreamException e) {
     69             e.printStackTrace();
     70         }
     71     }
     72 
     73     // 获得Event解析器(事件读取器对象)
     74     public static XMLEventReader getEventReader() {
     75         XMLEventReader reader = null;
     76         String xmlFile = App.class.getResource("/").getFile() + "users.xml";
     77         XMLInputFactory factory = XMLInputFactory.newInstance();
     78         try {
     79             reader = factory.createXMLEventReader(new FileReader(xmlFile));
     80         } catch (FileNotFoundException e) {
     81             e.printStackTrace();
     82         } catch (XMLStreamException e) {
     83             e.printStackTrace();
     84         }
     85         return reader;
     86     }
     87 
     88     // 获得Event解析器(指针读取器对象),过滤器
     89     public static XMLEventReader getEventReader(EventFilter eventFilter) {
     90         // 创建基于迭代器的指针读取器对象
     91         XMLEventReader filterReader = null;
     92         String xmlFile = App.class.getResource("/").getFile() + "users.xml";
     93         XMLInputFactory factory = XMLInputFactory.newInstance();
     94         try {
     95             XMLEventReader reader = factory.createXMLEventReader(new FileReader(xmlFile));
     96             filterReader = factory.createFilteredReader(reader, eventFilter);
     97         } catch (FileNotFoundException e) {
     98             e.printStackTrace();
     99         } catch (XMLStreamException e) {
    100             e.printStackTrace();
    101         }
    102         return filterReader;
    103     }
    104 
    105     @SuppressWarnings("rawtypes")
    106     public static void listAllByXMLEventReader() {
    107         // 创建基于迭代器的事件读取器对象
    108         XMLEventReader reader = App.getEventReader();
    109         try {
    110             // 遍历XML文档
    111             while (reader.hasNext()) {
    112                 XMLEvent event = reader.nextEvent();
    113                 // 如果事件对象是元素的开始
    114                 if (event.isStartElement()) {
    115                     // 转换成开始元素事件对象
    116                     StartElement start = event.asStartElement();
    117                     // 打印元素标签的本地名称
    118                     System.out.print(start.getName().getLocalPart());
    119                     // 取得所有属性
    120                     Iterator attrs = start.getAttributes();
    121                     while (attrs.hasNext()) {
    122                         // 打印所有属性信息
    123                         Attribute attr = (Attribute) attrs.next();
    124                         System.out.print(":" + attr.getName().getLocalPart() + "=" + attr.getValue());
    125                     }
    126                     System.out.println();
    127                 }
    128             }
    129             reader.close();
    130         } catch (XMLStreamException e) {
    131             e.printStackTrace();
    132         }
    133     }
    134 
    135     public static void listUsersByStreamFilter() {
    136         XMLStreamReader streamFilterReader = App.getStreamReader(new StreamFilter() {
    137             public boolean accept(XMLStreamReader reader) {
    138                 try {
    139                     while (reader.hasNext()) {
    140                         int event = reader.next();
    141                         // 只接受元素的开始
    142                         if (event == XMLStreamConstants.START_ELEMENT) {
    143                             // 只保留user元素
    144                             if ("user".equalsIgnoreCase(reader.getLocalName())) {
    145                                 return true;
    146                             }
    147                         }
    148                         if (event == XMLStreamConstants.END_DOCUMENT) {
    149                             return true;
    150                         }
    151                     }
    152                 } catch (XMLStreamException e) {
    153                     e.printStackTrace();
    154                 }
    155                 return false;
    156             }
    157         });
    158         try {
    159             // 列出所有用户的名称
    160             System.out.println(streamFilterReader.getLocalName());
    161             while (streamFilterReader.hasNext()) {
    162                 // 过滤工作已交由过滤器完成,这里不需要再做user的判断了
    163                 System.out.println("Name=" + streamFilterReader.getAttributeValue(null, "name"));
    164                 if (streamFilterReader.getEventType() != XMLStreamConstants.END_DOCUMENT) {
    165                     streamFilterReader.next();
    166                 }
    167             }
    168             streamFilterReader.close();
    169         } catch (XMLStreamException e) {
    170             e.printStackTrace();
    171         }
    172     }
    173 
    174     public static void listUsersByEventFilter() {
    175         XMLEventReader eventFilterReader = App.getEventReader(new EventFilter() {
    176             public boolean accept(XMLEvent event) {
    177                 // 如果事件对象是元素的开始
    178                 if (event.isStartElement()) {
    179                     // 转换成开始元素事件对象
    180                     StartElement start = event.asStartElement();
    181                     // 打印元素标签的本地名称
    182                     return "user".equals(start.getName().getLocalPart());
    183                 }
    184                 return false;
    185             }
    186         });
    187         try {
    188             // 列出所有用户的名称
    189             while (eventFilterReader.hasNext()) {
    190                 XMLEvent event = eventFilterReader.nextEvent();
    191                 StartElement start = event.asStartElement();
    192                 System.out.println(start.getName().getLocalPart());
    193                 // 过滤工作已交由过滤器完成,这里不需要再做user的判断了
    194                 System.out.println("Name=" + start.getAttributeByName(new QName("name")).getValue());
    195             }
    196             eventFilterReader.close();
    197         } catch (XMLStreamException e) {
    198             e.printStackTrace();
    199         }
    200     }
    201 
    202     public static void main(String[] args) {
    203         // listNames();
    204         // listNamesAndAges();
    205         // listAllByXMLEventReader();
    206         // listUsersByStreamFilter();
    207         // listUsersByEventFilter();
    208     }

     转自:http://blog.chinaunix.net/uid-20749563-id-718396.html

     转自:http://zangweiren.iteye.com/blog/647334

  • 相关阅读:
    【1093 Ghajini 线段树】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) K A short problem】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) C Asteroids】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) E Little Elephant and Sorting】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) F A Mame】
    【hdu 1022 (简单栈题目),,狂敲代码】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) B Modular Inverse】
    【hdu 1069 Monkey and Banana(动态规划,被坑死。一遍AC)】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) D Little Elephant and Rozdil】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) H Petya and Strings】
  • 原文地址:https://www.cnblogs.com/qiyebao/p/4573071.html
Copyright © 2011-2022 走看看