JAVA学习-XML

本文介绍了XML的基本语法,包括处理指令、注释、标签、元素、属性、实体替换和CDATA,强调了XML的可扩展性和在JAVA中使用Dom4j API进行XML处理的方法,包括读取、解析和创建XML文档的示例。
摘要由CSDN通过智能技术生成

# XML 

可扩展的标记语言

## XML 语法

### 处理指令

XML建议在文件最开始使用一个处理指令

    <?xml version="1.0" encoding="UTF-8"?>

要点:

0. 可以没有处理指令,但是建议使用!
1. 必须写在第一行
2. 属性 version="1.0" encoding="UTF-8"
    - 目前 version 始终都是1.0 木有变过
    - encoding 强烈建议使用 UTF-8!

绝大部分XML的处理指令都写为:

    <?xml version="1.0" encoding="UTF-8"?>

### 注释

语法

    <!-- Hello World! -->

注释: 

1. 注释不能嵌套使用!

### 标记(标签)tag

标记语法: 
    
    <标记名>   开始标记
    </标记名>  结束标记
    <标记名/>  自结束标记

语法:

1. XML 大小写敏感!区分大小写! 
2. 开始标签与结束标签要成对使用!
3. 如果是空标记可以使用自结束标签代替
    
        <age></age> 替换为 <age/>

4. 标签是可以嵌套使用的! 

### 元素 Element

语法:

    开始标签+内容Content+结束标签 

关键点:

1. 元素的内容可以是: 子元素,文本或者元素与文本的混合体
2. XML文档只能有一个唯一的根元素!!!

### 属性 Attribute

语法:

    name="Value" 

关键点:

1. 在开始标签上可以定义
2. 属性: name="Value" value必须有引号
3. 可以定义多个属性,属性之间必须有空格
4. 属性是无序的

### 实体替换(转义)

XML 文件中的特殊字符会解析错误:

    <comment>小于号是<大于号是></comment>
    
> 这里 `<大于号是>` 会被误解为开始标记。

解决的办法是替换为响应的“实体Entity”,其实就是一种转义写法:

    <comment>小于号是&lt;大于号是&gt; and 是 &amp; </comment>

常用的 "实体" 有

    小于号 &lt;
    大于号 &gt; 
    &      &amp;

### CDATA

对于大量的文本,可以利用CDATA包裹起来,这样就可以不用转义了,如:

        <code><![CDATA[
            XML 元素 <user></user>
        ]]></code>

## XML 的可扩展特性

XML 是可扩展特性: 
1. 标签名可以任意扩展
2. 标签(元素)的嵌套关系可以扩展
3. 标签的属性可以扩展

## XML API

标准的 W3C SAX DOM API非常难以使用,开源社区提供了Dom4j API 非常简便易用,已经成为XML处理的标准。

### 导入 dom4j API

利用Maven导入Dom4j,Maven的使用配置请参考:[http://doc.tedu.cn/maven/index.html](http://doc.tedu.cn/maven/index.html)

步骤:

1. 创建Maven项目
2. 配置 pom.xml 导入 dom4j

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>cn.tedu</groupId>
          <artifactId>1710_api12</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <dependencies>
              <!-- maven 组件的坐标 -->
            <dependency>
              <groupId>dom4j</groupId>
              <artifactId>dom4j</artifactId>
              <version>1.6.1</version>
            </dependency>
          </dependencies>
        </project>

### 读取XML

利用Dom4j 的API可以读取xml文件:

    String file="books.xml";
    FileInputStream in =
            new FileInputStream(file);
    SAXReader reader = new SAXReader();
    //read方法从流中读取byte,并且解析为
    //Document 对象(称为文档对象dom)
    Document doc = reader.read(in);
    //检查文档对象doc的内容
    System.out.println(doc.asXML());
    
>  SAXReader 相当于高级流需要从节点流中in读取xml内容。

>  SAXReader 也提供了方便使用的重载read方法。

>  按asXML 用于检验doc对象的内容

### 解析XML的内容

XML 内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="b1" lang="cn">
            <name>十八岁给我一个姑娘</name>
            <author>冯唐</author>
        </book>
        <book id="b2" lang="cn">
            <name>相关何处</name>
            <author>土家野夫</author>
        </book>
        <book id="b3" lang="cn">
            <name>和空姐同居的日子</name>
            <author>三十</author>
        </book>
        <owner>刘苍松</owner>
    </books>

读取解析XML获取全部书籍的ID和name案例:
    
    public class Demo01 {
        public static void main(String[] args) 
            throws Exception{
            /**
             * 利用Dom4j API 读取XML文件
             */
            //books.xml 位置在项目文件夹中
            String file="books.xml";
            FileInputStream in =
                    new FileInputStream(file);
            SAXReader reader = new SAXReader();
            //read方法从流中读取byte,并且解析为
            //Document 对象(称为文档对象dom)
            Document doc = reader.read(in);
            //检查文档对象doc的内容
            //System.out.println(doc.asXML()); 
            //System.out.println(doc.getClass());
            
            //找到唯一的根元素 books
            Element root=doc.getRootElement();
            //System.out.println(root.asXML()); 
            //从root找到全部的 book 子元素
            //elements() 返回 root的全部子元素
            //root.elements()
            //返回root子元素中 指定名称的子元素。
            //root.elements(标签名)
            List<Element>list=
                root.elements("book");//返回全部book
            //root.elements();//返回所有book+owner
            for (Element e : list) {
                //e 代表每个子元素
                //System.out.println(e.asXML());
                //找到book元素中第一个name子元素
                //Element name=e.element("name");
                //getText 可以获取元素中的文本内容
                //String text=name.getText();
                //System.out.println(text);
                
                
                //读取book元素的属性
                String id=e.attributeValue("id");
                System.out.println(id);
                
                String n=e.elementText("name");
                System.out.println(n);
            }
        }
    }

### 创建XML文档

利用DOM4j 可以创建XML 文档对象:

    Document doc=
        DocumentHelper.createDocument();
    //添加根元素
    Element root=
            doc.addElement("products");
    //addElement 在当前元素上添加子元素
    //"product"是子元素名,返回子元素对象
    Element p1=root.addElement("product");
    //为元素添加属性参数为: 属性名,属性值
    p1.addAttribute("id", "p1");
    //添加子元素并且添加文本
    p1.addElement("name").addText("擎天柱");
    
    Element p2=root.addElement("product");
    
    System.out.println(doc.asXML());

### 写XML文件

    //将doc对象写到文件中
    FileOutputStream out=
        new FileOutputStream(
        "products.xml");
    //Dom4j 提供了 “漂亮的 Pretty” 格式化功能
    OutputFormat fmt=
        OutputFormat.createPrettyPrint();
    //利用高级流 XMLWriter 将doc对象写到文件中
    XMLWriter writer=
            new XMLWriter(out,fmt);
    writer.write(doc);
    writer.close();

## 如何读取XML

1. 先了解被读取的XML结构!!
2. 利用Dom4j 打开文件
3. 按照XML结构利用Dom4j API 按层次读取。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值