26
2019
10

Java解析xml

XML文档以层级标签的形式来组织数据,多用于配置文件、存储静态数据、交换数据。

   XML语法

   1 每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,<?xml version="1.0"?>

   2 任何的起始标签都必须有一个结束标签。   

   3 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签。

   4 标签如果有属性,属性值必须加双引号。

    XML文档解析

   首先我们要知道,“XML中的内容都是结点”,这句话的意思是、XML文档中,无论是  <> </> 符号的里面的内容(属性)、之间的内容(结点值)、还是 <> 本身(结点),都是Node,就连标签之间的换行、空格都是一个节点。明白这个很重要,因为下面遍历结点时,返回的 属性名值对 、结点值内容、结点本身 都是一个Node类型。

   一、DOM方法

   Java自身原生的两种解析XML方式之一——DOM方法,原理是、首先在内存中创建一个Document对象,然后把XML文档读取进来赋值给这个dom对象。由于dom对象是基于树结构的,所以对dom对象进行遍历即可。对内存中的dom对象可以进行查询、修改、删除操作,还可以写回原XML文档保存修改。

   优点、

    a、由于整棵树在内存中,因此可以对xml文档随机访问

    b、可以对xml文档进行修改操作

   缺点、

    a、整个文档必须一次性解析完

    a、由于整个文档都需要载入内存,对于大文档成本高

   操作步骤、

   1、创建DocumentBuilderFactory,由newInstance()方法获取工厂实例;

   2、由工厂创建DocumentBuilder;

   3、通过  Document dom=builder.parse(file);  读取xml文档创建dom对象;

   4、通过dom对象的一系列方法获取某个结点、某名字的结点列表、

 Element getElementById(String elementId) 

          返回具有带给定值的 ID 属性的 Element。 

 NodeList getElementsByTagName(String tagname) 

          按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。 

   5、通过NodeList对象获取结点列表中某个结点、

 Node item(int index) 

          返回集合中的第 index 个项。 

   6、通过Node对象读取结点属性、

 NamedNodeMap getAttributes() 

          包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。 

    然后对NamedNodeMap对象调用以下方法获取属性、(前面我们说过,属性也是结点)

 Node  getNamedItem(String name) 

          检索通过名称指定的节点。

     

 Node item(int index) 

          返回映射中第 index 个项。 

   最后,对返回的属性通过以下方法获取名、值、(属性也是结点)

 String getNodeName() 

          此节点的名称,取决于其类型; 

 String getNodeValue() 

          此节点的值,取决于其类型;

   7、获取结点的子节点列表、

 NodeList getChildNodes() 

          包含此节点的所有子节点的 NodeList。 

   8、获取结点值、

 String getNodeName() 

          此节点的名称,取决于其类型; 

 String getNodeValue() 

          此节点的值,取决于其类型;

总结、DOM方法解析XML文档,把元素、元素属性、元素值都看作Node类型,通过node.getNodeName()获取元素名、属性名,

通过getNodeValue()获取属性值、元素值,通过getChildNodes()获取子节点们,通过item(i)获取第i个属性或者第i个子节点。

二、SAX方法

  Java原生的XML解析方法之二——SAX方法,原理、通过parse(file,listener)函数用一个listener对xml文件进行查找,按顺序读取文档,遍历每个标签,当发现目标标签

时,读取标签的属性、结点值等信息并返回。

  优点、

    a、无需将整个xml文档载入内存,因此消耗内存少

    b、可以继承ContentHandler创建多个执行不同查询的listener进行解析操作

  缺点、

    a、不能随机的访问xml中的节点

    b、不能修改文档

    c、查询依次就要对XML文档从头到尾遍历一次

    操作步骤、

    1、创建解析工厂、SAXParserFactory factory = SAXParserFactory.newInstance();

    2、由工厂创建解析器、SAXParser parser = factory.newSAXParser();

    3、通过解析器的parse()方法,对指定xml文档以指定handler之类进行解析查询、parser.parse(xmlFile, new MySaxListener());

    我们要继承DefaultHandler类,定义相应的查询操作类、

   1、重写父类中的文档开始方法、文档结束方法,定义开始、结束遍历xml文档时的操作、

 void startDocument() 

          接收文档开始的通知。 

 void endDocument() 

          接收文档结束的通知。 

   2、重写父类的标签开始方法、标签结束方法,定义遍历到一个开始、结束标签时的操作、

 void startElement(String uri, String localName, String qName, Attributes attributes) //参数qName是标签名、attributes是属性列表

          接收元素开始的通知。 

void endElement(String uri, String localName, String qName) 

          接收元素结束的通知。 

    3、重写characters(char[] ch, int start, int length)方法、

    // 对事件发生时,元素的字符怎么处理  

    public void characters(char[] ch, int start, int length) throws SAXException {

        //参数ch是当上述4中事件随便一个发生时,对应的元素的值,值在ch中start开始,length长。从头到尾遍历整个xml文档时,每个标签的值依次被存入ch中。

 }

也就是说,通过SAX解析xml文档是没有dom对象出现的,所以不会有node,不会有getNodeName()、getNodeValue()获取结点名、值。

总结、SAX解析XML文档的结点名是通过事件函数的参数qName获取的,属性是通过参数attributes的getValue("属性名")获取的,

结点值是通过当前事件函数发生时,characters(char[] ch, int start, int length)方法中的内容获取的。

  三、JDOM方法

   JDOM方法是根据DOM方法的众多繁琐操作进行包装得到的,上面我们看到,DOM方法解析XML文档其实是很繁琐的,而且很混乱,标签、属性、换行空格都当作结点类型来处理。JDOM方法定义了一系列通俗、好记的方法来解析XML,方法的底层封装了一系列DOM操作,但是我们不必亲自去进行这些繁琐的工作了。

 优点、

    a、DOM方式的优点:查找方便,可以修改

 缺点

    a、DOM方式的缺点:装载整个文档,对内存容量要求高

  在JDOM中,同一了根节点、普通结点、属性等全为Element类型。

   操作步骤、

   1、创建一个SAXbuilder、SAXBuilder builder = new SAXBuilder();  

    2、创建文件输入流打开xml文件、InputStream in = new FileInputStream("XXX.xml");  

   3、通过builder,从输入流读取xml文件创建dom对象、Document dom = builder.build(in);  

   4、获取根节点、Element root=dom.getRootElement();

   5、获取子节点列表、List<Element> childNodes = node.getChildren();

   6、遍历子节点列表,获取第i个结点、Element node = childNodes.get(i);

   7、读取结点信息、

     1)结点属性值、node.getAttributeValue("属性名");

     2)结点名、node.getName();

     3)结点值、node.getValue();

     4)子结点文本值、node.getChildText("子结点名");

    四、DOM4J方法

    Dom4j是目前最流行、最好用的XML解析工具,解析XML的速度最快。

    操作步骤、

    1、创建SAXReader、SAXReader reader = new SAXReader(); 

    2、创建文件输入流打开xml文件、InputStream in = new FileInputStream("XXX.xml");

    3、通过reader和输入流读取xml文件到内存创建Document对象、Document dom = reader.read(in); 

    4、获取根节点、Element root=dom.getRootElement();

    5、获取子节点列表、List<Element> childNodes = root.elements();

    6、遍历子节点、Element node = childNodes.get(i);

    7、读取结点信息、

     1)结点属性值、node.attributeValue("属性名");

     2)结点名、node.getName();

     3)结点值、node.getValue();

     4)子结点文本值、node.elementText("子结点名")

 

    总结、

    1、DOM、JDOM、DOM4j都是把xml文档读取到内存中,生成dom对象进行遍历的;

         DOM是Java原生的,所以比较繁琐;

         JDOM是对DOM操作的封装,更加通俗、易记,操作也快了一点;

         DOM4j解析xml的函数上与JDOM差不多,只不过有几个相同功能的函数名字不同而已,过程都是一样的;但由于底层使用了Xpath等方法加快了索引,所以检索性能更快。

    2、SAX是基于事件驱动的,查询事件监听器继承自DefaultHandler,定义了检索xml过程中遇到开始标签、结束标签时执行的事件函数,从而查找需要的信息并返回而不是把整个文档都加载进来。

原文链接:https://www.qiquanji.com/post/8482.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。