• java の xml解析


    一个xml文件如下:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <books>
    3     <book>
    4         book text
    5     </book>
    6 </books>

    dom解析如下:

     1 public class parseTest
     2 {
     3     public static void main(String[] args) throws Exception
     4     {
     5         //创建工厂类。
     6         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     7         //用工厂类创建一个文档(document)解析器。
     8         DocumentBuilder builder = factory.newDocumentBuilder();
    
     9         //builder.parse()将给定的内容解析为一个XML文档,并且返回一个新的DOM 对象。
    10         Document document = builder.parse(new File("test.xml"));
    11         //获取文档的根节点。
    12         Element root = document.getDocumentElement();
    13         //获取root根节点的所有的子节点。
    14         NodeList booksNodes = root.getChildNodes();
    15         
    16         System.out.println("--------------华丽的分割线--node--------------");
    17         for(int i=0;i<booksNodes.getLength();i++){
    18             System.out.println(booksNodes.item(i));
    19         }
    20         System.out.println("--------------华丽的分割线--node.getNodeValue()--------------");
    21         for(int i=0;i<booksNodes.getLength();i++){
    22             System.out.println(booksNodes.item(i).getNodeValue());
    23         }
    24         System.out.println("--------------华丽的分割线--node.getFirstChild()--------------");
    25         for(int i=0;i<booksNodes.getLength();i++){
    26             System.out.println(booksNodes.item(i).getFirstChild());
    27         }
    28         System.out.println("--------------------------------------------------------");
    29         System.out.println("根节点下的节点总数:"+booksNodes.getLength());
    30     }
    31 }

    结果如下图:

    为什么呢?

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <books>
    3     before
    4     <book>
    5         book text
    6     </book>
    7     after
    8 </books>

    运行之后,结果如下图:

     ok,结果说明一切。下面开始总结:

    首先,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode。然后... ...

    1. 每个子节点与父节点之间都有默认的Text节点,如果没有赋值的话,节点内容为空,但仍然作为一个空节点存在着。

    2. DOM把<book>book text</book>也当作是两层结构的节点,其父节点为<book>节点本身,子节点是一个Text节点。因此,

    node.getNodeValue()获得是<book>节点的value值,而node.getFirstChild().getNodeValue()获得的才是Text节点的Value值。

    下面是SAX解析XML

    SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。其解析是按照xml文件的顺序一步一步一行一行的来解析。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <persons>
     3     <person id="23">
     4         <name>李明</name>
     5         <age>30</age>
     6     </person>
     7     <person id="20">
     8         <name>李向梅</name>
     9         <age>25</age>
    10     </person>
    11 </persons>
     1 public class ParseSax
     2 {   
     3     public static void main(String[] args)
     4     {
     5         try
     6         {
     7             FileInputStream input = new FileInputStream(new File("person.xml"));
     8             List<HashMap<String,String>> list = parseSax(input,"person");
     9             for(HashMap<String,String> book : list){
    10                 System.out.println(book.toString());
    11             }
    12         }
    13         catch (Exception e)
    14         {
    15             // TODO Auto-generated catch block
    16             e.printStackTrace();
    17         }
    18     }
    19     
    20     public static List<HashMap<String,String>> parseSax(InputStream input,String nodeName) throws ParserConfigurationException, SAXException, IOException{
    21         //创建SAX工厂
    22         SAXParserFactory factory = SAXParserFactory.newInstance();
    23         //创建SAX解析器
    24         SAXParser parser = factory.newSAXParser();
    25         SaxHandler handler = new SaxHandler(nodeName);
    26         parser.parse(input,handler);
    27         input.close();
    28         return handler.getList();
    29         
    30     }
    31 }
     1     public static class SaxHandler extends DefaultHandler{
     2         private HashMap<String,String> map = null;
     3         private List<HashMap<String,String>> list = null;
     4         private String currentTag = null;//正在解析的元素的标签
     5         private String currentValue = null;//正在解析的元素的值
     6         private String nodeName = null;
     7         
     8         public List<HashMap<String,String>> getList(){
     9             return list;
    10         }
    11         public SaxHandler(String nodeName){
    12             this.nodeName = nodeName;
    13         }
    14         
    15         @Override
    
    16         //当读取<?xml...>时,会调用startDocument()方法
    17         public void startDocument() throws SAXException
    18         {
    19             list = new ArrayList<HashMap<String,String>>();
    20         }
    21         
    22         @Override
    23         //当读取一个ElementNode的时候,会调用此方法。qName是节点名称,attributes是这个节点的属性。
    24         public void startElement(String uri, String localName, String qName,
    25                 Attributes attributes) throws SAXException
    26         {
    27             if(qName.equals(nodeName)){
    28                 map = new HashMap<String, String>();
    29             }
    30             if(attributes !=null && map !=null){
    31                 for(int i=0;i<attributes.getLength();i++){
    32                     map.put(attributes.getQName(i),attributes.getValue(i));
    33                 }
    34             }
    35             currentTag = qName;
    36         }
    37         
    38         @Override
    39         public void endElement(String uri, String localName, String qName)
    40                 throws SAXException
    41         {
    42             if(qName.equals(nodeName)){
    43                 list.add(map);
    44                 map = null;
    45             }
    46             super.endElement(uri, localName, qName);
    47         }
    48         
    49         @Override
    50         //当遇到TextNode节点时,调用此方法
    51         public void characters(char[] ch, int start, int length)
    52                 throws SAXException
    53         {
    54             if(currentTag !=null && map !=null){
    55                 currentValue = new String(ch,start,length);
    56                 if(currentValue !=null && !currentValue.equals("")&&!currentValue.replaceAll("\\s"," ").trim().equals("")){
    57                     map.put(currentTag, currentValue);
    58                 }
    59             }
    60             currentTag = null;
    61             currentValue = null;
    62         }
    63     }

     DOM4J解析

     1         SAXReader reader = new SAXReader();
     2         Document doc = reader.read(new File("person.xml"));
     3         
     4         Element rootElt = doc.getRootElement();//获得根节点
     5         System.out.println("根节点:"+rootElt.getName());
     6         
     7         Iterator<?> iter = rootElt.elementIterator();//遍历根节点下子节点
     8         while(iter.hasNext()){
     9             Element element = (Element) iter.next();
    10             Attribute attr = element.attribute(0);
    11             System.out.println(attr.getName()+"="+attr.getValue());
    12             Iterator<?> iters = element.elementIterator();
    13             while(iters.hasNext()){
    14                 Element ele = (Element) iters.next();
    15                 System.out.println(ele.getText());
    16             }
    17         }

    根节点:persons
    id=23
    李明
    30
    id=20
    李向梅
    25

  • 相关阅读:
    IT民工的时间哪儿来的
    解决Office2007安装时出现错误1706的方法
    情人节特献:有心之函数必然就有分手函数
    mathematica汉化 版本二
    项目经理职责与权利
    什么是产品经理?主要职责是什么?
    调查收藏
    如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?
    PHP的GC垃圾收集机制
    AWStats分析Tomcat\Apache\IIS\nginx 的访问日志
  • 原文地址:https://www.cnblogs.com/zyoohoo/p/2550923.html
Copyright © 2020-2023  润新知