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

1 篇文章 0 订阅


首先有一个这样的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

搞定!!!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值