XML和HTML其实是源自同一个先辈:SGML
XML比属性文件Properties的优势在于,结构层次清晰,不限于单一的平面层次结构(键值对,键还是唯一的)。
XML文档结构:
文档头:
<?xml version="1.0"?> 或者 <?xml version="1.0" encoding="UTF-8"?>
之后通常是文档类型定义(Document Type Definition,DTD)例如:(非必需品)
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
然后是元素,根元素和子元素,通常希望 文本有 标签包含。
并且XML中的元素可以使用属性,例如:
<font name="Helvetica" size="36" />
但是还有另外的:
<font>
<name>Helvetica</name>
<size>36</size>
</font>
属性的灵活性要差很多,例如要给属性添加一个单位,那么要带入到属性值里面去
<font name="Helvetica" size="36 pt" />
而
<font>
<name> Helvetica</name>
<size unit="pt">36</size>
</font>
别人的经验之谈,属性只应该用来修改值的解释,而不是用来指定值。所以当纠结于是设置属性,还是对某个值进行解释,我们
所以我们看到的,基本都是以元素的形式出现的……
解析XML文档
要处理XML文档,就要先解析(parse)它。解析器是这样一个程序,它读入一个文件,确认这个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素。Java提供了两种XML解析器:
文档对象模型(Document Object Model,DOM)解析器这样的树形解析器(tree parser),它们在读入的XML文档转换成树结构。
XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器(streaming parser)。它们在读入XML文档时生成相应的事件。
DOM解析器可能更容易一些,但是注意,当以要处理很长的文档的时候,用它生成树结构将会消耗大量内存;
或者如果你只是对于某些元素感兴趣,而不关心它们的上下文,那么在这些情况下你应该考虑使用流机制解析器。
DOM解析器的接口已经被W3C标准化了,(JDK中包含了自己的DOM解析器,DocumentBuilderFactory)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
当我们读入某个文档时
File f = ……
Document doc = builder.parse( f ) { url、in(输入流都行) }
然后通过调用 getDocumentElement 方法来启动对文档内容进行分析,返回根元素:
Element root = doc.getDocumentElement();
root.getTagName()返回元素的标签名;
获得子元素,使用getChildNodes()方法:
NodeList children = root.getChildNodes();
……
Node child = children.item(i)
……
有可能空白字符也会解析进去,可以用DTD来剔除,也可以程序剔除。
用到的API:
如果要指定文档结构,可以提供一个文档类型定义(DTD)或一个XML Schema 定义