Leks
Leks

Reputation: 77

Retrieve one attribute value using another attribute value in xml

I have an xml file like following

    <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>

from the xml file i want to get attribute value of "id" where attribute value of " parent="4" ". Though i know to simply retrieve the attribute values but i want to retrieve the attribute value by the attribute value of another attribute. How can i do this using xml parser in JAVA?

Upvotes: 0

Views: 992

Answers (2)

Leks
Leks

Reputation: 77

i have done it as following

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

Upvotes: 1

G_H
G_H

Reputation: 12009

You've got several options.

One is to turn your XML into a DOM (Document Object Model) and use an XPath expression on it to get the desired value. JDOM might be a good fit. See this question and its answer for examples: Select a node using xpath and jdom

The XPath expression you'd need is //mxCell[@parent='4']/@id. Note that if there's a default namespace defined in your XML document (you've provided an extract, not the whole document, so I can't tell) you'd need to bind that to a prefix and use it in the XPath expression.

Another option that won't require any external dependencies is to use XSLT. Check package javax.xml.transform for more info. A stylesheet that would output only the value you want is provided here:

<?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> 

Note that this will only output the id attribute of the first mxCell element with a parent attribute that has value 4. That's what the [1] does at the end of that XPath expression.

If the value to search for is dynamic (instead of always 4) I suggest using an XSLT parameter to pass it to the transformer.

For parsing the output of the XSLT and dealing with multiple values, I leave it up to you. It should be simple to continue on from here. Note that the XSLT approach will probably be the most performant. JDOM is a fine library but for large documents the overhead will be quite significant, so memory use may become an issue.

Upvotes: 0

Related Questions