Scala:XML解析 - 获取父标记,其中包含作为其子项的一部分的值

时间:2016-05-02 06:22:04

标签: scala xml-parsing

输入

<Groups>
<Group>
    <Service name="A" enable="0"/>
    <Service name="B" enable="1"/>
    <NodeSet>
        <Node ip="abd"/>
    </NodeSet>
</Group>

<Group>
    <Service name="E" enable="0"/>
    <Service name="F" enable="1"/>
    <NodeSet>
        <Node ip="mno"/>
    </NodeSet>
</Group>

</Groups>

我提供了一个非常简化的XML文件版本,我们正在使用它。

问题
我想要一个与给定IP匹配的服务列表。因此,在这种情况下,我希望获得IP A的服务Babd

我知道XPath,这将帮助我识别IP(如果存在)。但是,一旦找到IP(存在),我将无法找到服务名称。能否指导我找一个可以帮助我的好消息来源。

1 个答案:

答案 0 :(得分:1)

您实际所需的是Group节点,它们下面有指定的ip。首先获取它们,然后您可以遍历它们以从它们下面获取Service名称。在将XML解析为内存后,使用基本列表操作迭代和解析XML树非常简单:

val xml = XML.loadFile("file")
val matchingGroups = (xml \\ "Group").filter(n => (n \ "NodeSet" \ "Node" \ "@ip").text == "abd")
val serviceNames = matchingGroups.flatMap(n => n \ "Service").map(n => (n \ "@name").text)

根据确切的XML模式,可能需要进行一些修订 - 属性遍历仅适用于单个节点而非序列。