【问题标题】:Retrieve one attribute value using another attribute value in xml使用 xml 中的另一个属性值检索一个属性值
【发布时间】:2016-03-31 06:52:18
【问题描述】:

我有一个如下的xml文件

    <mxCell id="0"/>

    <mxCell id="1" parent="0"/><mxCell connectable="0" id="2" parent="1"value="a=5" vertex="1"></mxCell>

<mxCell id="3" parent="2"  value="op1" vertex="1"></mxCell>

<mxCell connectable="0" id="4" parent="1"  value="b=8" vertex="1"></mxCell>

<mxCell id="5" parent="4"  value="ip1" vertex="1"></mxCell>

<mxCell id="6" parent="4"  value="op1" vertex="1"></mxCell>

<mxCell connectable="0" id="7" parent="1"  value="c=_x+_y" vertex="1"></mxCell>

<mxCell id="8" parent="7"  value="ip1" vertex="1"></mxCell>

我想从 xml 文件中获取 "id" 的属性值,其中 "parent="4" 的属性值。虽然我知道简单地检索属性值,但我想通过另一个属性的属性值来检索属性值。我如何在 JAVA 中使用 xml 解析器来做到这一点?

【问题讨论】:

  • 循环遍历节点('mxCell')并搜索每个'parent'值,当找到'4'时,在列表中获取'id'(或者更好的是,在列表中获取节点)。

标签: java xml xml-parsing xml-attribute


【解决方案1】:

我做了如下

Element eElement=(Element)nNode;
if(eElement.getAttribute("parent").equals("4")
{
System.out.println("id"=+eElement.getAttribute("id"));
}

【讨论】:

  • 如果这必须是使用解析器处理文档的一部分,而不仅仅是获取值,那几乎是最直接和最有效的方法。
【解决方案2】:

您有多种选择。

一种是将您的 XML 转换为 DOM(文档对象模型)并在其上使用 XPath 表达式以获得所需的值。 JDOM 可能非常适合。有关示例,请参阅此问题及其答案:Select a node using xpath and jdom

您需要的 XPath 表达式是 //mxCell[@parent='4']/@id。请注意,如果在您的 XML 文档中定义了一个默认名称空间(您提供了一个提取,而不是整个文档,所以我无法确定),您需要将它绑定到一个前缀并在 XPath 表达式中使用它。

另一个不需要任何外部依赖项的选项是使用 XSLT。查看包裹javax.xml.transform 了解更多信息。这里提供了一个只输出你想要的值的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" />

    <xsl:template match="node()|@*">
        <xsl:apply-templates select="node()|@*" />
    </xsl:template>

    <xsl:template match="//mxCell[@parent='4'][1]">
        <xsl:value-of select="@id" />
    </xsl:template>

</xsl:stylesheet> 

请注意,这只会输出第一个 mxCell 元素的 id 属性,其父属性的值为 4。这就是 [1] 在 XPath 表达式末尾所做的事情。

如果要搜索的值是动态的(而不是始终为 4),我建议使用 XSLT 参数将其传递给转换器。

对于解析 XSLT 的输出和处理多个值,我把它留给你。从这里继续应该很简单。请注意,XSLT 方法可能是性能最高的。 JDOM 是一个很好的库,但是对于大型文档,开销会非常大,因此内存使用可能会成为一个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多