XML可扩展标记语言总结

1.XML的基本语法

1.1 XML概念

XML(eXtensible markup language) 可扩展的标记语言
XML是跨平台的标记语言,是一门独立的标记语言
各个语言都提供了对XML 的支持 JAVA C# PHP
XML具有自我描述的特性
XML主要用于 数据的存储传输(现已被JSON代替)

1.2XML语法

(1)声明
<?xml version="1.0" encoding="utf-8" ?>

通知解析 工具 获取xml 的一些信息

(2)元素 Element

元素的构成是由 开始标记 + 元素内容 + 结束标记 元素的内容可以是文本,也可以是其它元素 结束标记有 “/”
元素是大小敏感(区分大小写)
元素可以嵌套 但是不可以交叉
有开始标记必须有结束标记 zhangsan
<ds id="test1" /> ds 这个元素没有内容 可以简写 这个写法正确

(3)属性 Attribute

在开始标记中 可以定义属性 属性的值必须使用引号(可以是双引号 也可以单引号)引起来

      <person >
                     <name> zhangsan</name>
                     <name   value="zhangsan" />
             </person>  

(5)实体引用

xml文件中 有些内容无法正确的翻译 需要通过特殊的表示 才能正确的解析。
比如 < < & &
以后会在xml 中写 sql语句 比如 查询 s_emp 表 id 小于 10 的员工
select * from s_emp where id < 10

(6) 可以通过 CDATA 区 来解决 xml 翻译文本的问题

        <![CDATA[ 要进行保护的内容 ]]>
            <![CDATA[ select  * from  s_emp  where id < 10  ]]>               
            select  * from  s_emp  where id <![CDATA[  <  ]]>  10     

(7.)XML 树状结构

XML 文档 可以构成一个树状结构 每个文档必须有一个根元素 而且只能有一个
根元素是所有元素的父元素 同级别的子元素 构成兄弟元素

2.XML解析方式
DOM、SAX、JDOM、DOM4J

DOM (document object model) 文档对象模型
把整个xml 按照元素的层次关系 加载到内存中 形成一棵文档树

优点:可以遍历和修改整个文档结构 操作简单
缺点:内存压力比较大 解析速度偏慢

SAX(simple API FOR XML)

相对于DOM 是一种速度更快的处理方式 才用的是逐行扫描 对元素的开始标记 属性 内容
结束标记都有对应的事件 扫到对应的数据 就会触发对应的事件 所以我们可以针对不同的 事件 作出不同的处理。
优点:速度快 内存压力小
缺点:不能对节点进行修改

JDOM(Java-based Document Object Model)

JDOM的目的是成为Java特定文档模型

【优点】
①使用具体类而不是接口,简化了DOM的API。
②大量使用了Java集合类,方便了Java开发人员。

【缺点】
①没有较好的灵活性。
②性能较差。

DOM4J(Document Object Model for Java)

【优点】
①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
②支持XPath。
③有很好的性能。

【缺点】
①大量使用了接口,API较为复杂。

介绍 dom4j 的API

// dom4j 底层解析器
SAXReader reader = new SAXReader();
// 通过解析器对象 获取一个文档对象
Document doc = reader.read(new File(“文件的路径相对于项目开始”)); // 通过 doc 可以获取根元素
Element re = doc.getRootElement(); // Element 对应的API getName() 得到元素对应的标记名 getText() 得到元素对应的文本内容 Element
element(String name) 获取元素下指定名称的子元素。(根据标记名获得该元素) List
elements() 获取这个元素的所有子元素 elementText(String name) 根据元素的名字
拿到元素对应的内容 根据父元素直接拿到子元素对应的值 // Attribute 属性相关的API
通过元素 来获取对应的属性 attribute(String name) 根据属性
book.attribute(“id”) re.attribute(“id”)
获取属性对应的值 使用 属性对象对应的方法 getValue() 或者 元素对象对应的方法 attributeValue(String name)
获取子元素的内容的两种方法:
1.先根据父元素获取子元素,在根据子元素使用getText获取内容。
2.使用父元素用elementText(“元素名”)的方式直接获取子元素的内容
获取子元素的属性的两种方法:
1.先根据父元素获获取属性,在使用属性获取属性的值。
2.使用父元素用Attrivalue直接获取子元素属性的值。

使用XPath 的方式解析XML
简介

XPATH 是一种快速定位xml文档中信息的语法 不需要像dom方式 一层层的访问 元素信息 而是
可以通过路径直接定位到我们需要的信息。 dom4j 提供了对xpath 的支持 但是需要加入一个额外的包 jaxen

3.2 xpath 中的 api

通过 Document 对象 对应的方法 Node selectSingleNode(String xpath)
List selectNodes(String xpath) Node 对应的api getText()
获取节点对应的值 getName() 获取节点对应的名字

3.3 Xpath 表达式写法

nodename 直接获取这个节点名对应的节点 /nodename 从根位置开始获取
//nodename 从任何位置开始获取 . 当前位置 ..
代表父元素位置 @nodename @代表取属性

3.4 XPATH 谓语

用来选中 符合条件的节点 类似于sql语句中where 条件 谓语需要出现在 [] 中 比如: //title[1]
//title[last()] //book[price>50 ] //book[@id=’b100’] 通配符:
* 匹配所有的元素
@* 匹配所有的属性

4.使用java写XML

1.写出XML中的规范
2.写出使用 dom4j 解析xml的思路 并写出涉及的核心api

3.使用xpath 来解析下面的xml 只要写出xpath路径即可
java 100.1
php 98.1
UI 95.1
写出获取节点的api 选出所有的 book 对应 的 name 选出所有的 book 并且要求 price 小于
100 选出所有的 book 对应的name 并且要求 price 大于 100

如果book 中的name 出现了 < 号 该如何处理
1.XML知识点补充 xml 中的dtd 和 schema
dtd 和 schema 都是为了 规范 和 限制xml的
有了dtd 和 schema 就规范了 相应的xml 中 可以出现哪些元素 对应的属性内容
以及元素的顺序 都可以规范。

代码部分:
books.xml

<?xml version="1.0"  encoding="utf-8" ?>
<books>
         <book>  
                  <name>细说php</name>
                  <author> aa</author>
                  <price> 58.8</price>
         </book>
         <book>  
                  <name>java从入门到精通</name>
                  <author>zz</author>
                  <price> 49.8</price>
         </book>
         <book>  
                  <name>戏说java</name>
                  <author>ss</author>
                  <price>100.1</price>
         </book>
</books>

使用Dom4j:获取book.xml相关元素

import java.io.File;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4ParseXML {

    public static void main(String[] args){
        //创建一个dom4j的底层解析器
        SAXReader reader = new SAXReader();

        try {
            //通过解析器对象获得一根文档对象
            Document doc =reader.read(new File("books.xml"));
            //获取一个根元素。
            Element re=doc.getRootElement();
            System.out.println("文档的名字"+re.getName());
            System.out.println("文档的内容:"+re.getText());
            //获取子元素,如果有多个只能拿第一个元素.
            //根据元素标记名得到该元素
            Element book=re.element("book");
            //或得该元素的名字和名字相应的内容
            System.out.println("元素的名字:"+book.getName());
            System.out.println("book元素的name元素的内容:"+book.elementText("name"));
            // 拿出book  对应的价格
            //两种方式
            //使用标记名获得该元素,然后去该元素获取内容。
            Element price=book.element("price");
            System.out.println(price.getText());
            //根据父元素直接拿到子元素对应的内容,price使用元素名字获取元素的内容
            System.out.println(book.elementText("price"));

            //获取这个元素的所有子元素
            System.out.println("--------------------------------");
            List<Element> books=re.elements();
            for(Element b:books){
                //获取所有子元素的内容
                System.out.println(b.elementText("name"));
                // 如何来获取作者?
                System.out.println(b.elementText("author"));
                // 如何来获取价格?
                System.out.println(b.elementText("price"));

                // 获取属性  和 属性对应的值的两种方式
                Attribute id_ab=b.attribute("id");
                System.out.println(id_ab.getValue());
                System.out.println(b.attributeValue("id"));
                System.out.println("--------------------------------");
            }

        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

}

使用Xpath:获取book.xml相关元素

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPath {

    public static void main(String[] args) {
    //构建一个解析器
        SAXReader reader = new SAXReader();

    try {
        //使用解析器来获取Document对象
        Document doc =reader.read(new File("books.xml"));
        //获得根节点元素名.
        Node n =doc.selectSingleNode("books");
        System.out.println("根节点元素名是:"+n.getName());
        //查询文档中所有book下name的内容。从任何位置获取。
        List<Node>book_names=doc.selectNodes("//book/name");
        for(Node bname:book_names){
            System.out.println(bname.getText());
        }
        System.out.println("-------------");
        //所有的作者找出来?
        //也可以使用XPath和dom4j结合的方式
        List<Node>books=doc.selectNodes("//book");
        for(Node book:books){
            Element e=(Element) book;
            Element eauthor=e.element("author");
            System.out.println("作者为"+eauthor.getText());

        }
        // 把所有的属性 id 找出来 
        List<Node>book_ids=doc.selectNodes("//@id");
        for(Node bid:book_ids){
            System.out.println(bid.getText());
        }
        // 把所有book节点的id 属性找出来
        List<Node>book_ids2=doc.selectNodes("//book/@id");
        for(Node bprice:book_ids2){
            System.out.println(bprice.getText());
        }
        System.out.println("---------------------");
        // 选中 book元素  price  大于 50 的   并且 小于 100 
        List<Node>book_price=doc.selectNodes("//book[price>50][price<100]/price");
        for(Node bprice:book_price){
            System.out.println("书的价格是:"+bprice.getText());
        }
        // 选中book元素 id 属性等于1001  获取这本书的 name
        Node name = doc.selectSingleNode("//book[@id='1001']/name");
        System.out.println("书的名字是:"+name.getText());
        //查找子元素下的price  
        List<Node>book_prices=doc.selectNodes("//*[price>'50']/price");
        for(Node prices:book_prices){
            System.out.println("书的价格是:"+prices.getText());
        }

    } catch (DocumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

}

使用java写XML

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;

public class WriteXML {

    public static void main(String[] args) {
        //写一个文档对象
        Document doc =DocumentHelper.createDocument();
        //写一个根元素
        Element books=DocumentHelper.createElement("books");
        //添加元素的属性
        books.addAttribute("id", "1001");
        //添加books的子元素
        Element book =books.addElement("book");
        //添加book的子元素
        Element book_name=book.addElement("name");
        //为name元素增加内容,add不会替换原有的数据
        book_name.addText("java从入门到精通");
        //为name元素增加内容,set会替换原有的数据
        book_name.setText("word");
        Element book_author =book.addElement("author");
        book.setText("明日");
        Element book_price =book.addElement("price");
        book.setText("58");
        doc.setRootElement(books);
        try {
            // 构建一个文件流对象然后使用 XMLWriter 写XML
            //写入到对象的文档中
            FileOutputStream fos = new FileOutputStream("books.xml");
            //创建XMLWriter,将xml传给fos中进行写入
            XMLWriter xml=new XMLWriter(fos);
            //将文档写入xml中
            xml.write(doc);
            xml.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值