Java DOM 处理XML时调用getChildNodes函数,子节点个数问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoushenghuang/article/details/50609031


首先有一个这样的XML文档

<?xml version = "1.0" encoding = "utf-8"?>
<School> aaa
    <Student trip="ok">
        <Name>沈浪</Name>
        <Num>1006010022</Num>
        <Classes>信管2</Classes>
        <Address>浙江杭州3</Address>
        <Tel>123456</Tel>
    </Student>
    <Student>
        <Name>沈1</Name>
        <Num>1006010033</Num>
        <Classes>信管1</Classes>
        <Address>浙江杭州4</Address>
        <Tel>234567</Tel>
    </Student>
    <Student>
        <Name>沈2</Name>
        <Num>1006010044</Num>
        <Classes>生工2</Classes>
        <Address>浙江杭州1</Address>
        <Tel>345678</Tel>
    </Student>
    <Student>
        <Name>沈3</Name>
        <Num>1006010055</Num>
        <Classes>电子2</Classes>
        <Address>浙江杭州2</Address>
        <Tel>456789</Tel>
    </Student>
</School>

使用Java处理这个文档,输出根节点下的子节点信息:

public void test() {
  String filePath="C:\\Users\\shz\\RCPDemo\\school.xml";
  DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  factory.setIgnoringElementContentWhitespace(true);
  try {
   DocumentBuilder db=factory.newDocumentBuilder();
   Document xmldoc=db.parse(new File(filePath));
   Element  root=xmldoc.getDocumentElement();
   //removeTextNode(root);//预处理
   NodeList children =root.getChildNodes();
   for(int i=0;i<children.getLength();i++){
    Node child=children.item(i);
    System.out.println(child.getNodeName());
   }
   System.out.println(root.getChildNodes().getLength());
   
  } catch (ParserConfigurationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SAXException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

输出结果为:

#text
Student
#text
Student
#text
Student
#text
Student
#text
9

一共有9个节点,这是因为DOM是有严格的规范,子节点之间的空白回车换行也都是一个节点了,我们如果不需要这些节点,就可以先把这些节点删掉,好在这些节点的类型都是TEXT_NODE,所以在处理这个DOM之前,先搞个递归函数预处理一下:

void removeTextNode(Node root){
  if(root.hasChildNodes()){
   NodeList children=root.getChildNodes();
   int count=children.getLength();
   for(int i=count-1;i>=0;i--){//需要从后往前删除,防止出现沙漏效应
    Node child=children.item(i);
    if(child.getNodeType()==Node.TEXT_NODE){
     child.getParentNode().removeChild(child);
    }
    else {
     removeTextNode(child);
    }
   }
  }
 }

把前面那个被注释掉的函数调用放开,重新运行就好了:

结果就是:

Student
Student
Student
Student
4

搞定!!!

猜你喜欢

转载自blog.csdn.net/zhoushenghuang/article/details/50609031