83 // 4. 获取节点类型
84 if (node.getNodeType() == Node.ELEMENT_NODE) {
85 printElement((Element) node);
86 } else {
87 printOtherNode(node);
88 }
89 }
90 indentLevel--;
91 }
92 static void printOtherNode(Node node) {
93 if (node.getNodeType() == Node.COMMENT_NODE) {
94 printIndent();
95 System.out.printf("\n",node.getNodeName());
96 } else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
97 printIndent();
98 System.out.printf("\n",node.getNodeName());
99 }
100 }
101 private static Document doc;
102 private static int indentLevel = 0;
103 }
3. 通过XPath的方式访问XML中的节点:
XPath语言的基本语法如下:
1) /gridbag/row: 表示根元素gridbag的子元素中所有的row元素。
2) /gridbag/row[1]: 使用[]选定一组元素中的特定元素,这里选择的是第一个子元素。
3) /gridbag/row[1]/cell[1]/@anchor: 描述了第一行第一个单元格的anchor属性。
4) /gridbag/row/cell/@anchor: 描述了作为根元素gridbag的子元素的那些行元素中的所有单元格的anchor属性节点。
5) count(/gridbag/row): XPath还提供了一些有用的函数,如count。
在Java SE5中增加了一个API来计算XPath表达式,需要先从XPathFactory创建一个XPath对象,如:
XPathFactory xpFactory = XPathFactory.newInstance();
XPath path = xpFactory.newXPath();
然后再调用eva luate方法来计算XPath表达式,如:
String username = path.eva luate("/gridbag/row[1]/@anthor",doc);
这种形式的eva luate()方法将返回一个字符串,也可以返回一组子节点,如:
NodeList nodes = path.eva luate("/gridbag/row",doc,XPathConstants.NODESET);
如果只有一个节点,则可以用NODE常量来代替NODESET,如:
Node node = path.eva luate("/gridbag/row[1]",doc,XPathConstants.NODE);
如果结果是一个数字,则使用XPathConstants.NUMBER,如:
int count = ((Number)path.eva luate("count(/gridbag/row)",doc,XPathConstants.NUMBER)).intValue();
以下代码仅列出比较常用的基于XPath查询XML的使用方式。
1 public class MyTest {
2 //
3 //
4 //
5 //
6 //
7 //
8 //
9 //
10 //
11 //
12 //
13 //
14 //
15 //
16 //
17 //
18 //
19 public static void main(String[] args) {
20 XPathReader reader = new XPathReader("D:/Test.xml");
21 //获取projects的第一个名字为project的子节点中属性名称为id的值。
22 String expression = "/projects/project[1]/@id";
23 System.out.println(reader.read(expression, XPathConstants.STRING));
24 //获取projects的第二个名字为project的子节点的name子节点的文本
25 expression = "/projects/project[2]/name";
26 System.out.println(reader.read(expression, XPathConstants.STRING));
27 //找到所有名字为project的节点,再搜索他们的子节点,找到名字为name的子节点,
28 //如果该name子节点的文本值为Telecommunication Project,那么包含该name的
29 //project节点将为符合该xpath查询条件的节点,之后在获取他的name子