zoukankan      html  css  js  c++  java
  • Java解析XMl文件之SAX和DOm方法

    如题,这两种方法的jar包都在jdk中,不需要下载。

    先来说下目录结构:

    首先建一个Peron类封装person.xml的属性;DomParseService和SaxParseService分别为两种解析方法的服务类。最后TestXml为测试类。

    Person.xml如下:

     1 <?xml version="1.0" encoding="gbk"?>
     2 <Persons>
     3     <Person id="1">
     4         <name>zhangsan</name>
     5         <sex></sex>
     6         <age>30</age>
     7     </Person>
     8     <Person id="2">
     9         <name>lisi</name>
    10         <sex></sex>
    11         <age>20</age>
    12     </Person>
    13 </Persons>
    View Code

    • SAX方法:
     1 public class SaxParseService extends DefaultHandler {
     2     private List<Person> mPersons = null;
     3     private Person mPerson = null;
     4     private String m_preTag = null;
     5 
     6     public List<Person> getPersons(InputStream xmlStream)
     7             throws ParserConfigurationException, SAXException, IOException {
     8         SAXParserFactory factory = SAXParserFactory.newInstance();
     9         SAXParser parser = factory.newSAXParser();
    10         SaxParseService handler = new SaxParseService();
    11         parser.parse(xmlStream, handler);
    12         return handler.getPersons();
    13     }
    14 
    15     private List<Person> getPersons() {
    16         return mPersons;
    17     }
    18 
    19     @Override
    20     public void startDocument() throws SAXException {
    21         mPersons = new ArrayList<Person>();
    22     }
    23 
    24     @Override
    25     public void startElement(String uri, String localName, String qName,
    26             Attributes attributes) throws SAXException {
    27         if ("Person".equals(qName)) {
    28             mPerson = new Person();
    29             mPerson.setId(Integer.parseInt(attributes.getValue(0)));
    30         }
    31         m_preTag = qName;
    32     }
    33 
    34     @Override
    35     public void endElement(String uri, String localName, String qName)
    36             throws SAXException {
    37         if ("Person".equals(qName)) {
    38             mPersons.add(mPerson);
    39             mPerson = null;
    40         }
    41         m_preTag = null;
    42     }
    43 
    44     @Override
    45     public void characters(char[] ch, int start, int length)
    46             throws SAXException {
    47         if (m_preTag != null) {
    48             String content = new String(ch, start, length);
    49             if ("name".equals(m_preTag)) {
    50                 mPerson.setName(content);
    51             } else if ("sex".equals(m_preTag)) {
    52                 mPerson.setSex(content);
    53             } else if ("age".equals(m_preTag)) {
    54                 mPerson.setAge(Integer.parseInt(content));
    55             }
    56         }
    57     }
    58 
    59 }
    View Code
    • DOM方法:
     1 public class DomParseService {
     2     public List<Person> getPersons(InputStream is)
     3             throws ParserConfigurationException, SAXException, IOException {
     4         List<Person> mPersons = new ArrayList<Person>();
     5         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     6         DocumentBuilder builder = factory.newDocumentBuilder();
     7         Document element = builder.parse(is);
     8         NodeList PersonNodes = element.getElementsByTagName("Person");
     9         for (int i = 0; i < PersonNodes.getLength(); i++) {
    10             Element PersonElement = (Element) PersonNodes.item(i);
    11             Person mPerson = new Person();
    12             mPerson.setId(Integer.parseInt(PersonElement.getAttribute("id")));
    13             NodeList ChildNodes = PersonElement.getChildNodes();
    14             for (int j = 0; j < ChildNodes.getLength(); j++) {
    15                 if (ChildNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
    16                     if("name".equals(ChildNodes.item(j).getNodeName())){
    17                         mPerson.setName(ChildNodes.item(j).getFirstChild().getNodeValue());
    18                     }else if("sex".equals(ChildNodes.item(j).getNodeName())){
    19                         mPerson.setSex(ChildNodes.item(j).getFirstChild().getNodeValue());
    20                     }else if("age".equals(ChildNodes.item(j).getNodeName())){
    21                         mPerson.setAge(Integer.parseInt(ChildNodes.item(j).getFirstChild().getNodeValue()));
    22                     }
    23                 }
    24             }
    25             mPersons.add(mPerson);
    26         }
    27         return mPersons;
    28 
    29     }
    30 }
    View Code

    测试类如下。里面正对SAX和DOM分别写了两个方法:

     1 public class TestXml {
     2 
     3     public static void main(String[] args) {
     4         SaxParse();
     5         DomParse();
     6     }
     7     public static void DomParse() {
     8         DomParseService dps=new DomParseService();
     9         try {
    10             List<Person> mPersons=dps.getPersons(new FileInputStream(new File("e:/Person.xml")));
    11             for(Person p:mPersons){
    12                 System.out.println(p.getName());
    13             }
    14         } catch (FileNotFoundException e) {
    15             e.printStackTrace();
    16         } catch (ParserConfigurationException e) {
    17             e.printStackTrace();
    18         } catch (SAXException e) {
    19             e.printStackTrace();
    20         } catch (IOException e) {
    21             e.printStackTrace();
    22         }
    23     }
    24     public static void SaxParse() {
    25         SaxParseService sps=new SaxParseService();
    26         try {
    27              List<Person> Persons=sps.getPersons(new FileInputStream(new File("e:/Person.xml")));
    28             for(Person p:Persons){
    29                 System.out.println(p.getName());
    30             }
    31         } catch (FileNotFoundException e) {
    32             e.printStackTrace();
    33         } catch (ParserConfigurationException e) {
    34             e.printStackTrace();
    35         } catch (SAXException e) {
    36             e.printStackTrace();
    37         } catch (IOException e) {
    38             e.printStackTrace();
    39         }
    40     }
    41 
    42 }
    View Code
  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/hoaprox/p/5259118.html
Copyright © 2011-2022 走看看