我目前有一个有趣的多层嵌套XML,我想从Java中提取它的价值。
这个XML中的所有节点都有泛型标记,每个标记都有泛型关键字。
我想提取的值是多层的,识别它的方法不是通过它的关键字,它是一个通用的关键字"NumericalValue“(有许多节点具有相同的关键字)。
它上面有一个节点(相同的层,但在它上面是>= 1节点),它有一个通用关键字"WordRepresentation“(有许多节点具有相同的关键字)和一个值"Customer ID”。我们知道,如果值"Customer ID“存在,下面的一个或多个节点,我们将找到关键字"NumericalValue”和值。
因此,提取我想要的值的逻辑是:首先解开嵌套的XML,直到我找到包含值"Customer ID“的级别,然后以某种方式记下该级别,并在同一级别中,继续导航到下一个节点,直到找到关键字"NumericValue”,并记录值。
有没有好的方法或工具可以在嵌套的XML中搜索特定值,并在同一级别中进行第二次搜索?
下面是XML的一个示例:
<xml>
<layer 1>
<layer 2>
</layer 2>
<layer 2>
<layer 3>
<layer 4>
<layer 5>
<layer 6>
<layer 7 keyword=WordRepresentaion>
<Value>Customer ID</Value>
</layer 7>
...
<layer 7 keyword=NumbericalValue>
<Value>453</Value>
</layer7>
...
</layer 6>
</layer 5>
</layer 4>
</layer 3>
</layer 2>
...
...
<layer 2>
</layer 2>
<layer 2>
</layer 2>
</layer 1>谢谢你的帮助
发布于 2017-02-07 02:44:07
我不确定我是否确切地理解了您要做的事情,但是您可以使用jsoup来解析XML。下面是一个示例:
String xml = "<xml>\n<layer 1>\n <layer 2>\n </layer 2>\n <layer 2>\n <layer 3>\n <layer 4>\n <layer 5>\n <layer 6>\n <layer 7 keyword=WordRepresentaion>\n <Value>Customer ID</Value>\n </layer 7>\n <layer 7 keyword=NumbericalValue>\n <Value>453</Value>\n </layer7>\n </layer 6>\n\n </layer 5>\n </layer 4>\n </layer 3>\n </layer 2>\n <layer 2>\n </layer 2>\n <layer 2>\n </layer 2>\n</layer 1>\n</xml>";
Document doc = Jsoup.parse(xml);
Elements elms = doc.select("Value:contains(Customer ID)"); // get all the elements that are about the searched one
if (elms.size() > 0) {
Element wrapper = elms.first().parent(); // get the first one's parent
Element layer = wrapper.parent();
Elements layerChildren = layer.getElementsByIndexGreaterThan(wrapper.elementSiblingIndex()); // get all elements in the layer that are below the reference element
for (Element e : layerChildren) {
if (e.attr("keyword").equals("NumbericalValue")) { // check to see if this is the searched element.
System.out.println("Got the element:\n" + e.outerHtml());
}
}
}这是另一种方法:
Elements els = doc.select("[keyword=NumbericalValue]");
for (Element e : els) {
int index = e.siblingIndex();
Elements elementsAbove = e.parent().getElementsByIndexLessThan(index);
for (Element above : elementsAbove) {
// Check if this node has an inner node with the value "Customer ID"
if (above.select("Value:contains(Customer ID)").size() > 0) {
System.out.println("FOUND A MATCH:\n" + e.outerHtml());
break;
}
}
}在本例中,所有的keyword= NumbericalValue都被选中,在循环中,我们查看它上面的元素,看看它们的值是否设置为Customer ID
https://stackoverflow.com/questions/42074597
复制相似问题