zoukankan      html  css  js  c++  java
  • XML解析的二种方法之dom解析

    XML解析的二种方法:dom解析和sax解析

                         文件大小      存储位置          读取速度

         dom解析     小文件      放在内存中              快

         sax解析       大文件        硬盘中                 慢         san解析是基于事件的

    dom解析java代码

    package com.huawei.xml;

    import java.io.File;
    import java.io.InputStream;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;

    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;

    public class TestXML {

    /**
    * 得到 classpath中的文件
    *
    *
    */
    public static void main(String[] args) throws Exception{
    /**
    * 首先得到 当前类所在的类加载器路劲
    *
    * 然后在根据一个资源的名字去得到该资源的输入流 如果没有 则返回null
    */
    InputStream in = TestXML.class.getClassLoader().getResourceAsStream("com/cdsxt/resources/Users.xml");
    //System.out.println(in);

    //得到dom解析的解析器
    //得到解析器的工厂
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //通过工厂去得到解析器
    DocumentBuilder builder = factory.newDocumentBuilder();
    //将文件的输入流解析为一个Document
    Document doc = builder.parse(in);

    //调用
    //parser(doc);
    //getSibling(doc);
    updateXML(doc);

    }

    public static void parser(Document document){
    //得到文档的跟标签
    Element root = document.getDocumentElement();

    //根据元素名称去得到 元素集合
    NodeList nodes = root.getElementsByTagName("User");
    //遍历元素
    for(int i=0;i<nodes.getLength();i++){
    Node node = nodes.item(i);
    //强转 一定要知道 当前的这个实例的实际类型是什么
    Element ele = (Element) node;
    //System.out.println(ele.getAttribute("id"));
    /*System.out.println(node.getNodeName());
    System.out.println(node.getNodeValue());
    System.out.println(node.getNodeType());*/

    //得到所有的子节点
    NodeList childs = ele.getChildNodes();
    for(int j=0;j<childs.getLength();j++){
    //得到每一个孩子元素
    Node c = childs.item(j);
    //需要去除 差异性
    if(c.getNodeType() == 1){
    System.out.println(c.getTextContent());
    }
    }
    }
    }

    public static void getSibling(Document document){
    //Element root = document.getDocumentElement();

    //Element lisi = document.getElementById("users1");
    //root.

    Element users = document.getDocumentElement();

    //System.out.println(lisi.getNodeName());
    //得到Users节点的第一个子节点
    Node first = users.getFirstChild();

    Node user = first.getNextSibling();

    //System.out.println(users.getFirstChild().getNodeName());

    while(user.getNodeType()!=1){
    user = user.getNextSibling();
    }

    System.out.println(user);
    }

    /**
    * 修改XML
    * @param document
    */
    public static void updateXML(Document document) throws Exception{

    //创建一个节点
    Element user = document.createElement("User");
    //创建一个age节点
    Element age = document.createElement("age");
    age.setTextContent("40");

    user.appendChild(age);

    document.getDocumentElement().appendChild(user);

    //创建一个 用于得到转换器的 工厂

    TransformerFactory factory = TransformerFactory.newInstance();

    //得到一个从源到目标的 转换器 Transformer

    Transformer transformer = factory.newTransformer();
    //构建源数据
    DOMSource src = new DOMSource(document);

    //得到类路径下面的file
    String filename = TestXML.class.getClassLoader().getResource("com/cdsxt/resources/Users.xml").getFile();
    //创建目标
    //StreamResult target = new StreamResult(new File("D:\workspace\TestXML\src\com\cdsxt\resources\Users.xml"));
    StreamResult target = new StreamResult(new File(filename));
    //transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(src, target);
    }

    }

     
     

    User.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    这是xm注视

    一个xml文档 只能有一个跟标签

    关于声明信息 它的前面不允许出现任何字符

    zhangsan 20 zhangsan@zhangsan.com it

    -->
    <Users>
    <User id="lisi">
    <username>lisi</username>
    <age>20</age>
    <email>lisi@lisi.com</email>
    </User>
    <User id="zhangsan">
    <username>zhangsan</username>
    <age>30</age>
    <email>zhangsan@zhangsan.com</email>
    </User>
    <User>
    <username>wangwu</username>
    </User>
    </Users>

  • 相关阅读:
    LeetCode OJ--Sort Colors
    LeetCode OJ--Single Number II **
    LeetCode OJ--Single Number
    LeetCode OJ--Subsets II
    LeetCode OJ--ZigZag Conversion
    3ds Max学习日记(三)
    3ds Max学习日记(二)
    3ds Max学习日记(一)
    PokeCats开发者日志(十三)
    PokeCats开发者日志(十二)
  • 原文地址:https://www.cnblogs.com/hwgok/p/5758918.html
Copyright © 2011-2022 走看看