Step By Step(Java XML篇) (四)

2014-11-24 03:19:38 · 作者: · 浏览: 2
Node node = nodeList.item(i);

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 // Banking Project

5 // Jan 10 1999

6 // Jan 10 2003

7 //

8 //

9 // Telecommunication Project

10 // March 20 1999

11 // July 30 2004

12 //

13 //

14 // Portal Project

15 // Dec 10 1998

16 // March 10 2006

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子