XML与使用DOM读取XML数据

XML与使用DOM读取XML数据

XML简介

XML是Extensible Markup Language的缩写,即可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据。
XML特点:

  • XML与操作系统、编程语言的开发平台都无关。
  • 规范统一,实现不同系统之间的数据互换。
  • XML技术应用广泛,最基本的如网站,应用程序配置信息一般采用XML文件描述。

XML的文档结构

1. XML声明

<?xml version="1.0" encoding=”utf-8”?>表示XML声明
  • version:文档符合XML1.0规范
  • encoding:文档字符编码,默认为“UTF-8”

对于任何一个XMl文档,其声明部分是固定格式

2. 标签
非空的元素一定是成对的标记
<起始标记>
<></>
</结束标记>
空元素:起始标记和接受标记是紧挨着的,空行和空格都没有,一般学成单标记的形式
<起始标记></结束标记>
–例如:“马牛逼"中就是开始标签,就是结束标签,”马牛逼“就是标签描述的内容,表示姓名信息

3. 元素
元素由开始标签、结束标签和元素内容组成,开始标签由”<“+”元素名“+">”组成·,结束标签由”<“+”元素名“+">”直接多了一个“/”。

元素的命名规范规则如下

  • 名称中可以包含字母、数字以及其它一些可见字符
  • 区分大小写
  • 不能以数字或"_" (下划线)开头
  • 不能以xml(或XML、或Xml 等)开头
  • 不能包含空格。

4. 根元素
每个XMl文档必须有且仅有一个根元素,如“".

根元素的特点

  • 根元素是一个完全包括文档中其他所有元素的元素
  • 根元素的起始标签要放在其他所有元素的起始标签之前
  • 根元素的结束标签要放在所有其他元素的结束标签之后

5.XMl中的特殊字符的处理

  • & 的xml实体引用就是&
  • <的xml实体引用就是 <
  • 的xml实体引用就是>

  • ‘(单引号)xm实体引用是’
  • "(双引号)xml实体引用是&quto;

解析XML概述

1.目前常用的XML解析技术有4种

1.DOM
DOM是基于XML的树结构来完成解析的,DOM解析XML文档时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用DOM API来操作这个树结构。因为整个文档的树结构是驻留在内修改、重新排列等多种功能。DOM解析XML的方式非常适用于多次访问XML的程序,但是DOM解析却是比较消耗资源的。

2. SAX
SAX是基于事件的解析.它是为了解决DOM解析的资源消耗而出现的。它不像DOM那样需要建立一棵完整的文档树,而是通过事件处理器完成对文档的解析。因为SAX解析不用事先调入整个文档,所以它的优势就是占用资源少,内存消耗小。一般在解析数据量较大的 XML文档时会采用这种方式。

3. JDOM
DOM是不针对语言的.而JDOM是针对Java的特定文档模型,它简化了与XML的交互并且比使用DOM更快。JDOM与DOM有两方面不同,首先,JDOM仅使用具体类而不使用接口,这在某些方面简化了API,但是也限制了灵活性。其次,API 大量使用了Java 集合类型,对于那些已经期悉这些类的Java开发者而言简化了使用。JDOM的优势在于”使用20%的精力解决80%的JavaX问题”。

4. DOM4J
DOM4J是一一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时它世个开源库。
DOM4J用于在Java平台上使用Java集合框架处理XML、XPath和XSLT.并与DOM. SAXN
REDMIK30完全集成。DOM4J大量使用接口,面向接口编程使它比JDOM更加灵活。如今越来越多的lanaAI QUAD CA有使周DOM4J来读写XML,特别值得-提的是Sun的JAXM也在使用DOM4J。

2.使用DOM读取和解析XML数据

1. DOM 概念
DOM是Document Object Model的简称,即文档对象模型,DOM 把XML文件映射成一棵倒挂的”树”, 以根元素为根节点,每个节点都以对象形式存在。通过存取这些对象就能够存取XML文档的内容。

2.使用工具步骤
可以使用Onele公司提供的JAXP lJawa API for XML Possn来解析XM. IAXP 包含3个包,
➢org.w3c.dom: W3C推荐的用于使用DOM解析XML文档的接口。
➢org.xml.sax: 用于使用SAX解析XML文档的接口。
➢javax.xml.parsers: 解析器工厂工具,获得并配置特殊的分析器。
在使用DOM解析XML时需要导入这些包中相关的类。JAXP会把XML文档转换成一个DOM树。使用DOM解析XML文档的步骤如下。
(1)创建解析器工厂对象,即DocumentBuilderFactory对象。
(2) 由解析器工厂对象创建解析器对象,即DocumentBuilder对象。
(3) 由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象。(4)以Document对象为起点对DOM树的节点进行增加、删除、修改、查询等操作。

XML文档代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Sj>
<Brand name="华为">
<Type name="P90"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone Z"/>
<Type name="iPhone ZL"/>
</Brand>
<Brand/>
</Sj>

根据使用DOM解析XML文档的步骤,关键代码如下

 //1. 需要dom 解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 2.dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //new File("D:\\books.xml")  绝对路径
        Document root = builder.parse(new File("resource/book.xml"));

        NodeList bookList = root.getElementsByTagName("book");

           for (int i = 0; i < pp.getLength(); i++) {
            Node p = pp.item(i);
            Element element = (Element) p;//强转
            String sj = element.getAttribute("name");

            NodeList xh = element.getChildNodes();  // 获取元素的子节点
            for (int g = 0; g < xh.getLength(); g++) {
                Element xhh = ((Element) xh.item(g));
                String x=xhh.getAttribute("name");
                System.out.println("手机:"+sj+x);
                }
            }
            
        Element pp = document.createElement("Brand");
        pp.setAttribute("name", "三星");
        Element xh = document.createElement("Type");
        xh.setAttribute("name", "NoteX");
        pp.appendChild(xh);
        Element sj = (Element) document.getElementsByTagName("Sj").item(0);
        sj.appendChild(pp);//添加

        NodeList list = document.getElementsByTagName("Brand");
        for (int i = 0; i < list.getLength(); i++) {
            Element brand = (Element) list.item(i);
            String btrandname = brand.getAttribute("name");
            if (btrandname.equals("三星")) {
                brand.setAttribute("name", "SAMSUNG");
                System.out.println("修改成功");
            }
        }//修改

        for (int g = 0; g < list.getLength(); g++) {
            Element brand = (Element) list.item(g);
            String brandname=brand.getAttribute("name");
            if(brandname.equals("SAMSUNG")){
                brand.getParentNode().removeChild(brand);
                System.out.println("删除成功");
            }
        }//删除

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer ts = tf.newTransformer();
        DOMSource domSource = new DOMSource(document);//保存

        ts.setOutputProperty(OutputKeys.ENCODING, "utf-8");
        StreamResult result = new StreamResult(new FileOutputStream("resource/de.xml"));//设置编码方式

        ts.transform(domSource, result);//将DOM转换为XML文件
        System.out.println("保存成功");
            }
         }

3. 使用DOM解析XML时主要使用以下对象

1) Node对象
Node对象是DOM结构中最基本的对象,代表了文档树中的一个抽象节点。在实际使用的时候,很少会真正用到Node这个对象.一般会用如Document. Element. Text 等Node对象的子对象来操作文档。
Node对象的主要方法如下。
➢getChildNodes( ): 返回包含此节点所有子节点的NodeList。
➢getFirstChild(): 如果节点存在子节点,则返回第一个子节点。
➢getLastChild(): 如果节点存在子节点,则返回最后一一个子节点。
➢getNextSibling(): 返回在DOM树中这个节点的下一个兄弟节点。
➢getPreviousSibling( ):返回在DOM树中这个节点的上一个兄弟节点。
➢getNodeName(): 返回节点的名称。
➢getNodeValue(): 返回节点的值。
➢getNodeType():返回节点的类型。

2) NodeList 对象
顾名思义,NodeList 对象是指包含了-一个或多个节点(Node) 的列表。可以简单地把它看成一个Node数组,也可以通过方法来获得列表中的元素。
NodeList对象的常用方法如下
➢getLength(): 返回列表的长度。
➢item(int index):返回指定位置的Node对象。

3) Document 对象
Document对象代表整个XML文档,所有其他的Node都以-定的顺序包含在Document对象之内.排列成一个树状结构,可以通过遍历这棵“树” 来得到XML文档的所有内容。它也是对XML文档进行操作的起点,人们总是先通过解析XML源文件而得到一一个Document对象,然后来执行后续的操作。
Document对象的主要方法如下
➢gEiemememeTName(Sring nam) 返回个NoleList对象,它包含了所有给定标签名的。标签。
➢gnDoumemeElemeene ,返回一个代表这个DOM树的根节点的Elemen对象,也就是代表)文档根元素的对象。

4) Element 对象
Element对象代表XML文档中的标签元素,继承自Node. 也是Node最主要的子对象。在标签中可以包含属性,因而Element对象中也有存取其属性的方法,如下所示
➢getribrte(Sring atbutename);返回标签中给定属性名称的属性的值。
➢getElementsByTagName(String name):返回具有给定标签名称的所有后代Elements的Nodeis

3.使用DOM4J API读取和解析XML数据

1. 使用DOM4J操作XMl数据
要使用DOM4J读写XML文档,需要先下载dom4j的jar包,在网站链接 下载后将相应jar包加入工程就可以使用了。

XML文档代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Sj>
<Brand name="华为">
<Type name="P90"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone Z"/>
<Type name="iPhone ZL"/>
</Brand>
<Brand/>
</Sj>

根据使用DOM解析XML文档的步骤,关键代码如下

 SAXReader reader = new SAXReader();
        Document document = reader.read(new File("resource/de.xml"));

        Element root = document.getRootElement();

        Element Brand = root.addElement("Brand");
        Brand.addAttribute("name", "三星");
        Element Type = root.addElement("Type");
        Type.addAttribute("name", "NoteXd");//添加
        System.out.println("添加成功");

        List Brands = root.elements("Brand");
        for (Iterator it = Brands.iterator(); it.hasNext(); ) {
            Element ele = (Element) it.next();
            if(ele.attributeValue("name").equals("三星")){
                Attribute attribute=ele.attribute("name");
                attribute.setText("SAMSUNG");
                System.out.println("修改成功!");
            }
        }//修改


        for(Iterator it=Brands.iterator();it.hasNext();) {
            Element ele = (Element) it.next();
            if (ele.attributeValue("name").equals("SAMSUNG"))
            {
                Attribute attribute=ele.attribute("name");
                ele.remove(attribute);
                System.out.println("删除成功!");
            }
        }//删除


        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");//转编码方式
        XMLWriter writer = new XMLWriter(new FileWriter("resource/de.xml"), format);
        writer.write(document);
        System.out.println("保存成功!");
        writer.close();

    }

}


版权声明:本文为weixin_47167816原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。