XML文档dom解析小记

Xml语法


一、声明

1、简单的语法声明

<?xml version=”1.0” ?>

2encoding 属性说明文档编码

 <?xml version="1.0" encoding="UTF-8" ?>

3standalone 属性说明文档是否独立------一个文档依赖于另一个文档

<?xml version="1.0" encoding="UTF-8" standalone=”yes” ?>

二、元素-----就是xml文件的标签

注意:xml文件中的所出现的空格和换行,xml解析程序会把他们当做标签内容处理。

例如:

1、<title>内容</title>
2、<title>
    内容
   </title>

2xml文件内容意义是不一样的。

Xml文件声明之前不能有注释

注释不能嵌套

三、CDATA

    在XML文件中有些内容不想让XML解析引擎解析执行而是把他当做原始内容输出,这时就可以把这些内容放到CDATA区中。

语法:<![CDATA[内容]]>

例如:

<![CDATA[
       <title>
           <br/>
       </title>
]]>

XML解析

一、主要分2dom sax

  1. dom:(Document Object Model,即文档对象模型)是W3C组织推荐解析XML的一种方式。

  2. sax:Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有XML解析器都支持。

二、XML解析开发包

Jaxp(sun)Jdomdom4j  他们的性能依次递增。

Tip:使用JAXP进行dom解析

注意点:

创建解析器对象

    在javax.xml.parsers 包中的DocumentBuilderFactory用于创建dom模式的解析器对象,DocumentBuilderFactory是一个抽象的工厂类,它不能直接实例化,但是它提供了一个newinstance方法,这个方法会根据本地平台默认安装解析器自动创建一个工厂对象并返回。

更新xml文档

        Javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表转成一个html文档;利用这个对象当然也可以把Document对象又重新写入到啊一个XML文件中。

Transformer 对象通过TransformerFactory获得。

// 使用dom方法对xml文档进行crud
public class Demo2 {
    // 读取xml文档中 <书名 name="xxxxx">javaScript</书名> 节点中的值
    @Test
    public void read1() throws Exception {
        // 1、创建工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 2、得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 3、解析xml文档,得到代表文档的document
        Document document = builder.parse("src/book.xml");
        NodeList list = document.getElementsByTagName("书名");
        Node node = list.item(1);
        String content = node.getTextContent();
        System.out.println(content);
    }

    // 得到xml文件中标签
    @Test
    public void read2() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        // 得到根节点
        Node root = document.getElementsByTagName("书架").item(0);
        list(root);
    }

    private void list(Node node) {
        if (node instanceof Element) {
            System.out.println(node.getNodeName());
        }
        NodeList list = node.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            Node child = list.item(i);
            list(child);
        }
    }

    // 得到xml文件中文档属性的值
    @Test
    public void read3() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");

        Element bookName = (Element) document.getElementsByTagName("书名")
                                             .item(0);
        String value = bookName.getAttribute("name");
        System.out.println(value);
    }

    // 向xml文档中添加节点:<售价>59.00元</售价>
    @Test
    public void add() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        // 创建节点
        Element price = document.createElement("售价");
        price.setTextContent("59.00元");
        // 把创建的节点挂到第一本书上
        Element book = (Element) document.getElementsByTagName("书").item(0);
        book.appendChild(price);
        // 把更新后的内容写回到xml文件中
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),
                     new StreamResult(new FileOutputStream("src/book.xml")));
    }

    // 向xml文档指定位置添加节点:<售价>59.00元</售价>
    @Test
    public void add2() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        // 创建节点
        Element price = document.createElement("售价");
        price.setTextContent("59.00元");
        // 得到参考节点
        Element refNode = (Element) document.getElementsByTagName("售价").item(0);
        // 得到需要插入子节点的节点
        Element book = (Element) document.getElementsByTagName("书").item(0);
        // 往book节点指定的节点处插入节点
        book.insertBefore(price, refNode);
        // 把更新后的内容写回到xml文件中
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),
                     new StreamResult(new FileOutputStream("src/book.xml")));
    }

    // 向xml文档节点上添加属性 <书名>javaWeb</书名> 添加 name="xxxxx"
    @Test
    public void addAttr() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        Element bookName = (Element) document.getElementsByTagName("书名")
                                             .item(0);
        bookName.setAttribute("bookName", "xxx");
        // 把更新后的内容写回到xml文件中
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),
                     new StreamResult(new FileOutputStream("src/book.xml")));
    }

    // 删除xml文档中的某个节点
    @Test
    public void delete() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        // 得到要删的节点
        Element e = (Element) document.getElementsByTagName("售价").item(0);
        /*
         * //得到要删除的节点的父节点 Element book=(Element)
         * document.getElementsByTagName("书").item(0); //父节点删除
         * book.removeChild(e);
         */
        e.getParentNode().removeChild(e);
        // 把更新后的内容写回到xml文件中
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),
                     new StreamResult(new FileOutputStream("src/book.xml")));
    }

    // 更新售价
    @Test
    public void update() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("src/book.xml");
        // 得到要删的节点
        Element e = (Element) document.getElementsByTagName("售价").item(0);
        e.setTextContent("19");
        // 把更新后的内容写回到xml文件中
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer tf = tffactory.newTransformer();
        tf.transform(new DOMSource(document),
                     new StreamResult(new FileOutputStream("src/book.xml")));
    }
}


在使用DOM解析XML文档时,需要读取整个XML文档,在内存中架构代表整个DOM树的Document对象,从而在对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机大量内存,并且容易导致内存溢出。SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完成才会对文档进行操作。

SAX采用事件处理的方式解析XML文档,利用SAX解析文档涉及2个部分:解析器和事件处理器。

1、解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个文档。

2、解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法的时候会把当前解析到的XML文件内容作为方法的参数传递给事件处理器。

3、事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松的得到SAX解析器解析到的数据,从而可以决定如何对数据进行处理。

/**
 * sax 解析xml文档
 */
public class Demo3 {

    public static void main(String[] args) throws ParserConfigurationException,
            SAXException, IOException {
        // 1、创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2、得到解析器
        SAXParser sp = factory.newSAXParser();
        // 3、得到读取器
        XMLReader reader = sp.getXMLReader();
        // 4、设置内容处理器
        reader.setContentHandler(new ListHandler());
        // 5、读取xml内容
        reader.parse("src/book.xml");
    }

}

// 得到xml文档的所有内容
class ListHandler implements ContentHandler {

    @Override
    public void startElement(String uri,
                             String localName,
                             String qName,
                             Attributes atts) throws SAXException {
        System.out.println("<" + qName + ">");
        for(int i=0;atts!=null&&i<atts.getLength();i++){
            String attName=atts.getQName(i);
            String attValue=atts.getValue(i);
            System.out.println(attName+"="+attValue);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println(new String(ch, start, length));

    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("<" + qName + ">");
    }

    @Override
    public void setDocumentLocator(Locator locator) {
        // TODO Auto-generated method stub

    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void startPrefixMapping(String prefix, String uri)
            throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void endPrefixMapping(String prefix) throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void ignorableWhitespace(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void processingInstruction(String target, String data)
            throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void skippedEntity(String name) throws SAXException {
        // TODO Auto-generated method stub

    }

}











你可能感兴趣的:(XML文档dom解析小记)