与HTML不同, XML是大小写敏感的。例如, <H1>和<h1>是不同的XML标签。
在HTML中,如果从上下文可以分清哪里是段落或列表项的结尾,那么结束标签(如</p>或</li>)就可以省略,而在XML中结束标签绝对不能省略。
在XML中,只有一个标签而没有相对应的结束标签的元素必须以/结尾,比如<imgsrc="coffeecup.png"/>。这样,解析器就知道不需要查找</img>标签了。
在XML中,属性值必须用引号括起来。在HTML中,引号是可有可无的。例如, <appletcode="MyApplet.class" width=300 height=300>对HTML来说是合法的,但是对XML来说则是不合法的。在XML中,必须使用引号,比如, width="300"。
在HTML中,属性名可以没有值。例如, <input type="radio" name="language"value="Java" checked>。 在 XML中 , 所 有 属 性 必 须 都 有 属 性 值 。 比 如 checked="true"或checked="checked"。
xml文档的结构
严格说来,文档头是可有可无的,但是强烈推荐你使用文档头。
<?xml version="1.0"?>
或
<?xml version="1.0" encoding="UTF-8"?>
文档头之后通常是文档类型定义( Document Type Definition, DTD),文档类型定义是确保文档正确的一个重要机制,但是这不是必需的 。
<?DOCTYPE ......>
最后,
XML
文档的正文包含根元素,根元素包含其他一些元素 。
元素的属性只应该在修改值的解释时使用,而不是在指定值时使用。
元素和文本是XML文档“主要的支撑要素”,以下是你会遇到的其他一些标记的说明:
字符引用( character reference)的形式是&#十进制值;或&#x十六进制值 。ß,
实体引用( entity reference)的形式是&name;
<小于,>大于等
CDATA部分( CDATA Section)用<![CDATA[和]]>来限定其界限。它们是字符数据的一种特殊形式。你可以使用它们来包含那些含有<、 >、 &之类字符的字符串,而不必将它们解释为标记
处理指令( processing instruction)是那些专门在处理XML文档的应用程序中使用的指令,它们将用<?和?>来限定其界限
注释( comment)用<!-和-->限定其界限
解析XML
Java库提供了两种XML解析器:
像文档对象模型( Document Object Model, DOM)解析器这样的树型解析器( tree parser),它们将读入的XML文档转换成树构。
像用于XML的简单API( Simple API for XML, SAX)解析器这样的流机制解析器( streaming parser),它们在读入XML文档时生成相应的事件。
要读入一个XML文档,首先需要一个DocumentBuilder对象,你可以从DocumentBuilderFactory中得到这个对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(xxx);xxx可以是文件,流等
调用
getDocumentElement
方法可以返回root
元素。
getTagName
方法可以返回元素的标签名。
如果要得到该元素的子元素(可以是子元素、文本、注释或其他节点),请使用 getChildNodes 方法。这个方法返回一个类型为 NodeList 的集合。这个类型在标准的 Java 集合类创建之前就建立了,它有一个与众不同的访问协议。 item 方法将得到指定索引号的项。 getLength 方法则提供了项的总数 。
检索到它们包含的文本字符串。这些文本字符串本身都包含在Text类型的子节点中。既然知道了这些Text节点是惟一的子元素,就可以用getFirstChild方法而不用再遍历一个NodeList。然后可以用getData方法检索存储在Text节点中的字符串。
也可以用getLastChild方法得到最后一项子元素,用getNextSibling得到下一个兄弟节点 。
如果要枚举节点的属性,请调用getAttributes方法。它返回一个NamedNodeMap对象,其中包含了描述属性的节点对象。可以用和遍历NodeList一样的办法在NamedNodeMap中遍历各子节点。调用getNodeName和getNodeValue方法可以得到属性名和属性值。
验证XML
XML解析器的一个很大的好处就是它能自动检验某个文档结构是否正确。
如果要规范文档结构,可以提供一个文档类型定义( DTD)或一个XML Schema定义。DTD或schema包含了用于解释文档是如何构成的规则。这些规则规范了每个元素的合法子元素和属性 。
太烦了,具体内容不学了,用到再说吧。
使用XPath定位信息
如果要定位某个XML文档中的一段特定信息,那么,通过遍历DOM树的众多节点来进行查找显得有些麻烦。 XPath语言使得访问树节点变得很容易。
XPath可以描述XML文档中的一组节点,例如,下面的XPath:/xxx/row描述了根元素xxx的子元素中所有的row元素。可以用[]操作符来选择特定元素:/xxx/row[1]这表示的是第一行(索引号从1开始)。
使用@操作符可以得到属性值。 /xxx/row[1]/@href可以得到href的值
Java SE 5.0增加了一个API来计算XPath表达式,需要先从XPathFactory创建一个XPath对象 。
XPathFactory pathFactory = XPathFactory.newInstance();
XPath xPath=pathFactory.newXPath();
然后,调用
evaluate
方法来计算
XPath
表达式:
XPath xPath=pathFactory.newXPath();
String name = xPath.evaluate("/xxx/row", db.parse(new File("")));
这种形式的
evaluate
方法将返回一个字符串。这很适合用来检索文本,比如前面的例子中的
username
节点中的文本 。
String evaluate(String expression, Object startingPoint)
从给定的起点计算表达式。起点可以是一个节点或节点列表。如果结果是一个节点或节点集,则返回的字符串包含所有文本节点子元素的数据。
Object evaluate(String expression, Object startingPoint, QName resultType)
从给定的起点计算表达式。起点可以是一个节点或节点列表。resultType是XPathConstants类的常量STRING、 NODE、 NODESET、 NUMBER或BOOLEAN之一。返回值是
String、 Node、 NodeList、 Number或Boolean。
生成XML文档
你可以直接通过一系列print调用,打印出各元素、属性和文本内容,来编写XML文件,但这并不是一个好主意。一个比较好的方法是用文档的内容构建一棵DOM树,然后再写出该树的所有内容。要建立一棵DOM树,你可以从一个空的文档开始。通过调用DocumentBuilder类的newDocument方法可以得到一个空文档。
使用Document类的createElement方法可以构建文档里的元素 。使用createTextNode方法可以构建文本节点 。
doc.appendChild(xxx);
xxx.appendChild(aaa);
aaa.appendChild(bbb);//添加节点
可能还需要设置元素属性,这只需调用
Element
类的
setAttribute
方法即可。