2014-09-23 74 views
0

我正在读取一个xml文件并执行一些功能。我想知道的是如何获取父元素下的元素数量。说我有一个xml文件,就像下面:找到java中父元素下的xml元素的数量

<TestCase> 
    <SelectedDataTableNames name="SearchData"> </SelectedDataTableNames> 

    <Open page="hsbc" ms="5000" /> 
    <Click object="hsbc.Personal_Link" /> 
    <Click object="hsbc.CreditCard_tab" /> 
    <Call businessComponent="Global.Verify_Search"> 
     <Param name="HotelName_Param" value="@SearchData_link" /> 
    </Call> 
    <CheckElementPresent object="hsbc.Img_Hotel_logo" Identifire="Hotel_Name_PARAM:@SearchData_ResultHotelName" fail="true" customErrorMessage="Searched hotel name is not present in the page." /> 
</TestCase> 

这里如何代码来获得“下的”元素的数量,这将是6

NodeList nList = doc.getElementsByTagName("Click"); 
      System.out.println(nList.getLength()); 

上面不会放弃的结果,因为它会仅限指定元素的serch。任何1都可以帮助我解决这个问题。该主题上的任何链接都将有所帮助。我碰到下面的代码,我不明白这是如何工作的。所以如果下面的代码对于这个问题是正确的,请帮助我理解这一点。

int childrenCount = doc.getChildNodes().item(0).getChildNodes().getLength(); 

回答

0

找到了问题的答案。有用。我遇到的问题是ELEMENT_NODE。我们必须过滤ELEMENT_NODE。这是工作代码。感谢那些帮助过那里的人。

File fXmlFile = new File("SearchPromotions.xml"); 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 
doc.getDocumentElement().normalize(); 

Element docEle = doc.getDocumentElement(); 
NodeList nl = docEle.getChildNodes(); 
if (nl != null && nl.getLength() > 0) { 
     for (int i = 0; i < nl.getLength(); i++) { 
      if (nl.item(i).getNodeType() == Node.ELEMENT_NODE) { 
       Element el = (Element) nl.item(i); 
       System.out.println(el); 
      } 
     } 
} 
1

如果您的xml总是处于指定格式,请为其生成一个xsd并生成jaxb类。然后简单地使用jaxb读取文件。然后,你就可以遍历文件的getter和简单地计算你有兴趣与

1
doc.getElementsByTagName("Click"); 

元素上面的代码将搜索标签名的所有元素“点击”的数量,在你的情况下,结果将2 所以,如果我理解你的问题,你想有直接孩子的数量,那么你可以做:

doc.getElementsByTagName("TestCase").item(0).getChildNodes().getLenth() 
+0

我试图打印它像 的System.out.println(doc.getElementsByTagName( “TestCase的”)。项目(0)。。getChildNodes()的getLength()); 但它说: 显示java.lang.NullPointerException \t在com.automatic.Main.main(Main.java:62) – Vithushan 2014-09-23 08:54:43

+0

这是我的misktake。现在它可以工作。但是把答案给我13错了。 – Vithushan 2014-09-23 09:06:53

1

NodeList l = doc.getElementsByTagName("xxx"); // Could be 'TestCAse'

得到你想要的父节点如果您知道只有一个节点w ith名称TestCAse只是做

Node parentNode = l.item(0); 

通过这样做,您可以访问父节点。

现在做这个

int count = parentNode.getChildNodes().getLength(); 

请参考documentation

更新::

这是因为DOM解析器考虑了空间,甚至进入检查的儿童人数在你的xml文件中成为一个节点,这样也算作一个节点,这就是为什么你得到这么多节点而不是仅仅3或4个

请将此方法添加到您的程序中。我以前遇到过类似的问题。清除白色空间然后做你正在做的事情。我相信它会工作

通过你的最顶端,或者这种方法所需的父节点,然后你在做什么

private void removeWhitespaceNodes(Node e) 
    { 
     NodeList children = e.getChildNodes(); 
     for (int i = children.getLength() - 1; i >= 0; i--) 
     { 
      Node child = children.item(i); 
      if (child instanceof Text && ((Text) child).getData().trim().length() == 0) { 
       e.removeChild(child); 
      } 
      else if (child instanceof Element) 
      { 
       removeWhitespaceNodes(child); 
      } 
     } 
    } 
+0

它给我空指针异常 – Vithushan 2014-09-23 08:58:49

+0

这是我的错误。现在它可以工作。但是给我的答案13错了。 – Vithushan 2014-09-23 09:07:23

+0

背后的原因是有一些空白。在你的节点和解析器之间,也将它们视为一个节点。请参阅更新。 – Oliver 2014-09-23 12:00:28