Java XML深入解析

参考《java核心技术2》

1 Java如何解析xml文档?

Java 提供了两种XML解析器:

  • 像文档对象模型(Document Object Model, DOM)解析器这样的树型解析器(tree parser),它们将读入的XML转换成树型结构。
  • 像XML简单的API(Simple API for XML,SAX)解析器这样的流机制解析器(Streaming parser),它们在读入XML文档时生成相应的事件。

DOM解析器是当XML比较大的时候,消耗比较大的内存。如果只考虑某些元素,可以采用SAM解析器。

如何读入一个XML文档?

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

public class HandleXmlFile {
    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            //xml 路径
            File file = new File("/**/test.xml");
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(file);
            Element root = doc.getDocumentElement();
            //遍历所有节点两种方法
            //第一种:
            NodeList children = root.getChildNodes();
            for (int i = 0; i < children.getLength(); i++) {
                Node child = children.item(i);
                //instancof 是用来在运行时指出对象是否是特定类的一个实例
                System.out.println(i);
                if (child instanceof Element) {
                    Element childElement = (Element)child;
                    Text textNode = (Text)childElement.getFirstChild();
                    String text = textNode.getData().trim();
                    System.out.println(text);

                }
                //Text text = (Text) child.getFirstChild();
                //String str = text.getData().trim();
                //System.out.println(str);

            }
            //第二种
            for (Node childNode = root.getFirstChild(); childNode != null;childNode = childNode.getNextSibling()) {
                if (childNode instanceof Element) {
                    Element childElement = (Element)childNode;
                    Text textNode = (Text)childElement.getFirstChild();
                    String text = textNode.getData().trim();
                    System.out.println(text);

                }
            }
            //获取属性
            NamedNodeMap attrs = root.getAttributes();
            for (int i = 0; i < attrs.getLength(); i++ ){
                Node attr = attrs.item(i);
                System.out.println(attr.getNodeName());
                System.out.println(attr.getNodeValue());
            }
            System.out.println(root.getTagName());
            System.out.println(doc.getXmlEncoding());
            System.out.println(doc.getXmlVersion());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

这里为什么需要判断是Element实例对象呢?

主要因为会获取换行和空白符,不是Element的实例对象,

 

你可能感兴趣的:(XML,XML)