Pankaj
Pankaj

Reputation: 5250

XPath to select Element by attribute value

I have following XML.

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghna</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

I want to select Employee element with id="4".

I am using below XPath expression which is not returning anything.

//Employee/[@id='4']/text()

I checked it at http://chris.photobooks.com/xml/default.htm and it says invalid xpath, not sure where is the issue.

Upvotes: 254

Views: 378122

Answers (4)

user2991288
user2991288

Reputation: 376

This snippet open a Web.Config file and return the value of a setting attribute by the name of attribute, with a single XPath

Dim origDoc As Xml.XmlDocument = New Xml.XmlDocument()
origDoc.Load(WebConfigFile)
Dim settingNode As Xml.XmlNode = origDoc.SelectSingleNode("/configuration/appSettings/add[@key='" + SettingName + "']/@value")
If settingNode Is Nothing Then Return Nothing
Return settingNode.Value

Upvotes: 0

JLRishe
JLRishe

Reputation: 101748

You need to remove the / before the [. Predicates (the parts in [..]) shouldn't have slashes immediately before them - they go directly after the node selector they are associated with.

Also, to select the Employee element itself, you should leave off the /text() at the end. Otherwise you'd just be selecting the whitespace text values immediately under the Employee element.

//Employee[@id = '4']

One more thing to note: // can be very slow because it searches the entire document for matching nodes. If the structure of the documents you're working with is going to be consistent, you are probably best off using a more explicit path, for example:

/Employees/Employee[@id = '4']

Upvotes: 362

rogerdpack
rogerdpack

Reputation: 66891

As a follow on, you could select "all nodes with a particular attribute" like this:

//*[@id='4']

Upvotes: 30

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185610

Try doing this :

/Employees/Employee[@id=4]/*/text()

Upvotes: 12

Related Questions