首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java从嵌套XML中的相邻节点中提取值的最佳方法

使用Java从嵌套XML中的相邻节点中提取值的最佳方法
EN

Stack Overflow用户
提问于 2017-02-07 02:19:34
回答 1查看 104关注 0票数 0

我目前有一个有趣的多层嵌套XML,我想从Java中提取它的价值。

这个XML中的所有节点都有泛型标记,每个标记都有泛型关键字。

我想提取的值是多层的,识别它的方法不是通过它的关键字,它是一个通用的关键字"NumericalValue“(有许多节点具有相同的关键字)。

它上面有一个节点(相同的层,但在它上面是>= 1节点),它有一个通用关键字"WordRepresentation“(有许多节点具有相同的关键字)和一个值"Customer ID”。我们知道,如果值"Customer ID“存在,下面的一个或多个节点,我们将找到关键字"NumericalValue”和值。

因此,提取我想要的值的逻辑是:首先解开嵌套的XML,直到我找到包含值"Customer ID“的级别,然后以某种方式记下该级别,并在同一级别中,继续导航到下一个节点,直到找到关键字"NumericValue”,并记录值。

有没有好的方法或工具可以在嵌套的XML中搜索特定值,并在同一级别中进行第二次搜索?

下面是XML的一个示例:

代码语言:javascript
复制
<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>

谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2017-02-07 02:44:07

我不确定我是否确切地理解了您要做的事情,但是您可以使用jsoup来解析XML。下面是一个示例:

代码语言:javascript
复制
    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());
            }
        }
    }

这是另一种方法:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42074597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档