在java中查找父元素下的xml元素数

时间:2014-09-23 06:40:33

标签: java xml file

我正在努力阅读xml文件并执行一些功能。我想知道的是如何获得父元素下的元素数量。假设我有一个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>

这里是如何编码以获得&#34;&#34;下的元素数量,这将是6。

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

上面不会给出结果,因为它只会为指定的元素进行处理。 any1可以帮我解决这个问题。关于该主题的任何链接也将有所帮助。我遇到了以下代码,我不明白它是如何工作的。因此,如果以下代码对于此问题是正确的,请帮助我理解。

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

4 个答案:

答案 0 :(得分:1)

如果您的xml始终采用指定格式,请为其创建xsd并生成jaxb类。然后只需使用jaxb读取文件。然后,您将能够使用getter遍历文件,并只计算您感兴趣的元素数量

答案 1 :(得分:1)

doc.getElementsByTagName("Click");

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

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

答案 2 :(得分:1)

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

获取所需的父节点

如果你知道只有一个名为TestCAse的节点,那就

Node parentNode = l.item(0);

通过执行此操作,您可以访问父节点。

现在通过这样做检查孩子的数量

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

请参阅documentation

<强>更新::

发生这种情况是因为DOM解析器将xml文件中的空格甚至Enter视为一个节点,因此也被视为一个节点,这就是为什么要获得这么多节点而不仅仅是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);
            }
        }
    }

答案 3 :(得分: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);
            }
      }
}