如何获得具有值的XML文档的最底层子元素(即没有其他子元素)?

时间:2014-07-07 22:59:51

标签: java xml

我需要解析一个提取最低级别子元素的XML文档。这是一个XML文档示例(概念上):

<outerelement>
    <insideElement1/>
    <insideElement2>
        <insideElement3>
            <child1>testval1</child1>
            <child2>testval2</child2>
            <child3>testval3</child3>
            <child4/>
            <child5>
                 <child51>testval51</child51>
            </child5>
            <child6>textval6</child6>
        </insideElement3>
    </insideElement2>
    <insideElement4>
</outerelement>

我想要检索出的是{“child1”,“child2”,“child3”,“child51”,“child6”},即严格包含值但自己没有孩子的子元素。< / p>

我的尝试是这样的:

private static ArrayList<String> array;

// ...

private static ArrayList<String> findChildren(Node documentElement) {

    if (!documentElement.hasChildNodes()) {
        array.add(documentElement.getNodeName());
    }
    NodeList nl = documentElement.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++) {
        Node currentNode = nl.item(i);
        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            doIt(currentNode);
        }
    }
    return array;
}

但是对于我给出该方法的各种输入,它要么得到不正确的结果,要么得不到所有正确的结果。

2 个答案:

答案 0 :(得分:0)

See a regex solution.您可以在节点本身捕获:

/<(.*?)>.*?<\/\1>/gm
  

<(.*?)>将括号内的任何内容与懒惰的捕获组1和括号本身进行匹配。

     

.*?匹配括号后的任何内容,尽可能少。这允许更快地跳到正则表达式的下一部分:

     

<\/\1>断言存在文字&lt;,/ 以及捕获组1中捕获的元素,然后是文字&gt;

这里有代码,它重用Pattern来提高效率:

// Class
private static final Pattern FIELD_PATTERN =
    Pattern.compile("<(.*?)>.*?<\\/\\1>");

// Method
{
    Matcher matcher=FIELD_PATTERN.matcher(document_string);
    while(matcher.find())
        System.out.println(matcher.group(1));
}

Here's a live code demo.

示例STDOUT:

  

child1
  的child2
  child3
  child51
  child6

答案 1 :(得分:0)

使用XPath表达式//*[not(*)]。这将选择所有没有元素子元素的后代元素。