zoukankan      html  css  js  c++  java
  • 【Javaweb学习】解析XML

    1. 解析XML的方式有两种

      dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式

      sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所有的XML解析器都支持它

    区别:

      dom需要读取整个XML文档,在内存中构建代表这个DOM树的Document对象,然后再对XML文档进行操作;

      SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个XML文档装载完才会对文档进行操作。

    2. XML解析开发包

    2.1  JAXP开发包

      JAXP开发包是JavaSE的一部分,由 javax.xml   org.w3c.dom   org.xml.sax 及其子包组成。

    (1)DOM方式

    • 遍历所有节点
    • 查找某一个节点
    • 删除结点
    • 更新结点
    • 添加节点
        //1.创建工厂
        DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();
        //2.得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();//Add Exception
        //3.解析xml文档,得到代表文档的document
        Document document = builder.parse("src/book.xml");

       //4.对xml文档进行操作 NodeList list
    = document.getElementsByTagName("书名"); Node bookNameNode = list.item(0); String content = bookNameNode.getTextContent(); System.out.println(content);

    (2)SAX方式

    SAX采用事件处理的方式解析文件,涉及两个部分:解析器和事件处理器。创建出解析器后,就可以采用SAX方式解析XML文档,只要解析到文档的一个组成部分,都会调用事件处理器的一个方法,并把当前解析到的xml内容作为方法的参数传递给事件处理器。事件处理器由开发者编写自己的业务逻辑。

    sax解析例子

      1 public class Demo1 {
      2 
      3     /**    
      4      * @throws SAXException
      5      * @throws ParserConfigurationException
      6      * @throws IOException
      7      */
      8     public static void main(String[] args) throws ParserConfigurationException,
      9             SAXException, IOException {
     10 
     11         // 1.创建解析工厂
     12         SAXParserFactory factory = SAXParserFactory.newInstance();
     13 
     14         // 2.得到解析器
     15         SAXParser sp = factory.newSAXParser();
     16 
     17         // 3.得到读取器
     18         XMLReader xmlReader = sp.getXMLReader();
     19 
     20         // 4.设置内容处理器
     21         xmlReader.setContentHandler(new ListHandler());
     22 
     23         // 5.读取xml文档内容
     24         xmlReader.parse("src/book.xml");
     25     }
     26 
     27 }
     28 
     29 // 得到文档的所有内容
     30 class ListHandler implements ContentHandler {
     31 
     32     @Override
     33     public void setDocumentLocator(Locator locator) {
     34         // TODO Auto-generated method stub
     35 
     36     }
     37 
     38     @Override
     39     public void startDocument() throws SAXException {
     40         // TODO Auto-generated method stub
     41 
     42     }
     43 
     44     @Override
     45     public void endDocument() throws SAXException {
     46         // TODO Auto-generated method stub
     47 
     48     }
     49 
     50     @Override
     51     public void startPrefixMapping(String prefix, String uri)
     52             throws SAXException {
     53         // TODO Auto-generated method stub
     54 
     55     }
     56 
     57     @Override
     58     public void endPrefixMapping(String prefix) throws SAXException {
     59         // TODO Auto-generated method stub
     60 
     61     }
     62 
     63     @Override
     64     public void startElement(String uri, String localName, String qName,
     65             Attributes atts) throws SAXException {
     66         System.out.println("<" + qName + ">");
     67         
     68         for(int i=0; atts!=null && i<atts.getLength(); i++){
     69             String name = atts.getQName(i);
     70             String value = atts.getValue(i);
     71             System.out.println("(" +name+ "=" +value+ ")");
     72         }
     73     }
     74 
     75     @Override
     76     public void endElement(String uri, String localName, String qName)
     77             throws SAXException {
     78         System.out.println("</" + qName + ">");
     79 
     80     }
     81 
     82     @Override
     83     public void characters(char[] ch, int start, int length)
     84             throws SAXException {
     85         System.out.println(new String(ch, start, length));
     86 
     87     }
     88 
     89     @Override
     90     public void ignorableWhitespace(char[] ch, int start, int length)
     91             throws SAXException {
     92         // TODO Auto-generated method stub
     93 
     94     }
     95 
     96     @Override
     97     public void processingInstruction(String target, String data)
     98             throws SAXException {
     99         // TODO Auto-generated method stub
    100 
    101     }
    102 
    103     @Override
    104     public void skippedEntity(String name) throws SAXException {
    105         // TODO Auto-generated method stub
    106 
    107     }
    108 
    109 }
    View Code

    更新XML文档例子

        //将更改后的内存document写入xml文档
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book2.xml")));

    2.2 Dom4j开发包

    dom4j是简单灵活的开源库,性能优异、功能强大、容易使用,不仅hibernate在用,连sun公司自己都在用。

    //DOM4j中,获得Document对象的方式有三种:    
    //1.读取XML文件,获得document对象            
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("input.xml"));
    
    //2.解析XML形式的文本,得到document对象.
    String text = "<members></members>";
    Document document = DocumentHelper.parseText(text);
    
    //3.主动创建document对象.
    Document document = DocumentHelper.createDocument();
    //创建根节点
    Element root = document.addElement("members");
    //Document对象写入xml文件中         
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("gb2312");
    
    XMLWriter xw = new XMLWriter(new FileOutputStream("src/book.xml"),format);
    xw.write(document);
    xw.close();
  • 相关阅读:
    洛谷 P1363 幻想迷宫
    洛谷 P2872 [USACO07DEC]道路建设Building Roads
    字符编码
    python 基础数据类型
    python基础数据类型
    Python中的流程控制
    Python的入门基础
    计算机基础
    Java Random 随机数
    Java Array二维数组使用
  • 原文地址:https://www.cnblogs.com/lhat/p/6202993.html
Copyright © 2011-2022 走看看