XML

1.为什么要用xml文件:

  1. xml是用于传输和存储数据
  2. 其跨系统/平台/语言,不受限制,以相同的XML文件把不同的东西连接起来.结构清晰,通俗易懂
  3. 它的存储结构是:树形结构,xml文件中存储的内容就可以把它理解成是倒着的树形结构,即根节点在最上面,下面依次会有不同的子节点,而子节点又会长出更为细小的子节点.

2.什么是XML:

  1. XML 指可扩展标记语言(EXtensible Markup Language)
  2. XML 是一种标记语言,很类似 HTML
  3. XML 的设计宗旨是传输数据,而非显示数据
  4. XML 标签没有被预定义。您需要自行定义标签
  5. XML 被设计为具有自我描述性
  6. XML 是 W3C 的推荐标准
  7. XML 仅仅是纯文本,跨系统/平台/语言,不受限制
  8. XML 是不会做任何事情的,仅仅是包装在 XML 标签中的纯粹的信息
  9. XML 是独立于软件和硬件的信息传输工具
  10. XML 无所不在,是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

3. XML的作用
#.可作为一种简单的数据库,存储并检索数据;
#.传输约定格式的文件;
#.做软件的配置文件.

4.XML实例:书店示例

android xml 层级_xml布局内容总结_java

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

由上我们可以看出头结点"bookstore",即这是一个书店.上面我们也说了XML我们是可以自己定义的.在"bookstore"下面有三个"book"子元素.
"book category=’’> "这个"category"我们称为属性
‘‘book’’ 元素有 4 个子元素:’‘title’’、’‘author’’、’‘year’’、’‘price’’。
注:在写XML正文之前,需要加一个声明,声明的格式是:

<?xml version="1.0" encoding="UTF-8"?> 包含版本,和字符集编码

5.XML的语法:

  1. 所有 XML 元素都须有关闭标签
  2. XML 标签对大小写敏感
  3. 简化写法,例如:< name >< /name> 可以简化为: < name />
  4. XML 必须正确地嵌套
  5. XML 文档必须有根元素:XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
  6. XML 的属性都必须有值,且值须加引号
  7. 需要转义字符,如"<"需要用&lt来代替
  8. XML 中的注释
  9. 在 XML 中,空格会被保留,文档中的空格不会被删节。

6.XML解析:
解析就是获取XML文件的内容,获取节点名,节点值,属性名,属性值 .
通常有4中解析方式:

①.DOM: 文档对象模型,用于树结构,擅长(小规模)读/写
     ②.SAX: 流机制解析器,擅长读
     ③.DOM4J: JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能,它使用接口和抽象基本类方法。
     ④. JDOM: 仅使用具体类,而不使用接口
     
     在使用DOM和SAX方式解析时,是不需要单独下载jar包的,但是当用JDOM和DOM4J时,需要单独下载jar包并导入到项目中

Final:比较总结

DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
DOM是W3C处理XML的标准API,因其直观易用,其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析和修改.但是在解析大数据量的XML文件会遇到内存泄露及程序崩溃的风险.

下面我们来解析一个小例子:

解析的目标是,在解析之后,java程序能够得到xml文件的所有数据.

android xml 层级_xml布局内容总结_编程_02


步骤:

1.新建一个Project.-package-class

2.在项目中创建一个XMl文件或者复制一个XML文件到项目中

3.

android xml 层级_xml布局内容总结_XML_03


4.分别获取里面的节点内容

public class DomTest {
    public static void main(String[] args) {
       //创建一个DocumentBuilderFactory的对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //创建一个DocumentBuilder对象
        try {
            //创建DocumentBuilder对象
            DocumentBuilder db = dbf.newDocumentBuilder();
            //通过DocumentBuilder对象的Parse方法加载book.xml文件到当前项目下
            Document document = db.parse("book.xml");
            //获取所有Book节点的集合
            NodeList bookList = document.getElementsByTagName("book");
            //遍历Book节点
            for (int i = 0; i < bookList.getLength(); i++) {
                System.out.println("================开始遍历第"+ (i+1) + "本书的内容===============");
                System.out.println("第" +(i+1)+ "本书的内容为:");
                //获取每一个Book节点
                Node book = bookList.item(i);
                //获取Book节点所有属性集合
                NamedNodeMap attrs = book.getAttributes();
                //遍历book的属性
                for (int j = 0; j < attrs.getLength(); j++) {
                    //获取book节点的属性
                   Node attr =  attrs.item(j);
                   //获取属性名
                    System.out.print("属性名:" + attr.getNodeName());
                    //获取属性值
                    System.out.println(",属性值:" + attr.getNodeValue());
                    //解析book节点的子节点
                    NodeList childNodes = book.getChildNodes();
                    //遍历childNodes获取每个节点的节点名称和节点值
                    for (int k = 0; k < childNodes.getLength(); k++) {
                        //区分出text类型的node以及element类型的Node
                        if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                            //获取Element类型的节点的节点名称
                            System.out.print("第"+ (k+1) +"个节点名称:" + childNodes.item(k).getNodeName());
                            //获取Element类型的节点的节点名称的值
                            System.out.println(",节点的值:" + childNodes.item(k).getFirstChild().getNodeValue());
                        }
                    }
                }
                System.out.println("================结束遍历第"+ (i+1) + "本书的内容===============");
            }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
        }
    }
}