我需要解析一个提取最低级别子元素的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;
}
但是对于我给出该方法的各种输入,它要么得到不正确的结果,要么得不到所有正确的结果。
答案 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));
}
示例STDOUT:
child1
的child2
child3
child51
child6
答案 1 :(得分:0)
使用XPath表达式//*[not(*)]
。这将选择所有没有元素子元素的后代元素。