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 //
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(" 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("%s>",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("%s>",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