Step By Step(Java XML篇) (二)

2014-11-24 03:19:38 · 作者: · 浏览: 8
return 0;

84 int sum = 0;

85 // 首先,第一个是节点的根,判断一下是不是ELEMENT

86 boolean isElement = (node.getNodeType() == Node.ELEMENT_NODE);

87 // 如果节点的根是ELEMENT节点,那sum的初始值就是1

88 if (isElement)

89 sum = 1;

90 // 发挥节点的所有子节点

91 NodeList children = node.getChildNodes();

92 // 没有任何子节点的情况下,返回当前值

93 if (null == children)

94 return sum;

95 // 遍历节点的所有子节点

96 for (int i = 0; i < children.getLength(); i++)

97 sum += getElementCount(children.item(i));

98 return sum;

99 }

2. 一个相对完整的通过DOM模型遍历XML所有节点的例子:

1 public class MyTest {

2 //以下为该示例的样例数据

3 //该例子仅为样例代码,有些实现部分为hardcode,只是为了演示XML各种节点的访问方式。

4 //

5 //

6 //

7 //

8 //

9 //

10 // This is test data

11 //

12 public static void main(String[] args) {

13 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

14 factory.setIgnoringElementContentWhitespace(true);

15 // 取得DocumentBuilder对象

16 DocumentBuilder builder = null;

17 try {

18 builder = factory.newDocumentBuilder();

19 } catch (ParserConfigurationException e) {

20 }

21 ByteArrayOutputStream bout = new ByteArrayOutputStream(512);

22 PrintStream ps = new PrintStream(bout);

23 ps.println("");

24 ps.println("");

25 ps.println("");

26 ps.println("

27 "size=\"100\" isnull=\"true\" allow_multi_val=\"N\" />");

28 ps.println("

29 "size=\"100\" isnull=\"true\" allow_multi_val=\"N\" />");

30 ps.println("

31 "size=\"100\" isnull=\"true\" allow_multi_val=\"N\" />");

32 ps.println("This is test data");

33 ps.print("");

34 ps.flush();

35 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());

36 // 取得Document对象

37 try {

38 doc = builder.parse(bin);

39 } catch (SAXException e) {

40 e.printStackTrace();

41 } catch (IOException e) {

42 }

43 // 1. 首先获取根节点

44 Element rootElement = doc.getDocumentElement();

45 printElement(rootElement);

46 System.out.printf("",rootElement.getTagName());

47 }

48 static void printIndent() {

49 for (int i = 0; i < indentLevel; ++i)

50 System.out.print("\t");

51 }

52 static void printElement(Element element) {

53 printIndent();

54 System.out.printf("<%s",element.getTagName());

55 //注意这里的Attribute被存储在Map里面,因此他是基于AtrributeName排序的。

56 //5. 获取属性节点列表,并遍历Element的属性列表

57 NamedNodeMap nodeMap = element.getAttributes();

58 for (int i = 0; i < nodeMap.getLength(); ++i) {

59 Node node = nodeMap.item(i);

60 if (i == 0)

61 System.out.print(" ");

62 //6. 获取每个属性的Name和Value。

63 System.out.printf("%s = %s ", node.getNodeName(), node.getNodeva lue());

64 if (i == nodeMap.getLength() - 1)

65 System.out.print(" />");

66 }

67 String text = element.getTextContent();

68 if (nodeMap.getLength() == 0)

69 System.out.print(">");

70 if (element != doc.getDocumentElement()) {

71 if (!text.trim().isEmpty()) {

72 System.out.print(text);

73 System.out.printf("",element.getTagName());

74 }

75 }

76 System.out.println();

77 // 2. 获取子节点列表

78 NodeList nodeList = element.getChildNodes();

79 indentLevel++;

80 for (int i = 0; i < nodeList.getLength(); ++i) {

81 // 3. 遍历子节点

82