Reputation: 9307
I am parsing a xml document, I need find out the gid (an attribute) value (3810).
Based on SelectSingleNode()
. I found it is not easy to find the attribute name and it's value.
Can I use this method or must I switch to another way.
Attached is my code.
How can I use book
obj to get the attribute value3810
for gid
. Thank you.
My test.xml file as below
<?xml version="1.0" ?>
<root>
<VersionInfo date="2007-11-28" version="1.0.0.2" />
<Attributes>
<AttrDir name="EFEM" DirID="1">
<AttrDir name="Aligner" DirID="2">
<AttrDir name="SequenceID" DirID="3">
<AttrObj text="Slot01" gid="3810" unit="" scale="1" />
<AttrObjCount value="1" />
</AttrDir>
</AttrDir>
</AttrDir>
</Attributes>
</root>
I wrote the test.cs as below
public class Sample
{
public static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XmlNode book;
XmlNode root = doc.DocumentElement;
book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]");
Console.WriteLine("Display the modified XML document....");
doc.Save(Console.Out);
}
}
[Update 06/10/2010]
The xml file is a complex file. Included thousands of gids. But for each of Xpath, the gid is unique.
I load the xml file to a TreeView control. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
. When treeView1_AfterSelect
event occurred, the e.Node.FullPath
will return as a String Value.
I parse the string Value e.Node.FullPath
. Then I got the member of XPath Above. Then I tried to find which gid item was selected.
I need find the gid value as a return value indeed.
Upvotes: 19
Views: 64211
Reputation: 101700
The problem here was they your XPath was all wrong. You had this:
Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]
which would either select or not select the Attributes element depending on whether all the names matched up. This XPath should take you directly to the gid attribute you want:
Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid
Upvotes: 0
Reputation: 57707
You can write
XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid");
String gidValue = null;
if (gidAttribute!=null)
value = gidAttribute.Value;
Alternatively, expand the Xpath to fetch the attribute, e.g.
Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid
If the @gid is unique, then you can simply use the Xpath
"//AttrObj[@gid='3810']"
To fetch the desired node with the given id. But note that each request will search through the entire document. It will be more efficient to fetch all the nodes, and then put them in a map, keyed by id.
"//AttrObj[@gid]"
Use XmlNode.SelectNodes
to fetch a list of all AttrObj with a @gid attribute.
Upvotes: 14
Reputation: 100288
You can query XmlDocument
itself not DocumentRoot
:
XmlDocument doc = new XmlDocument();
XmlNode book = doc.SelectSingleNode("..");
if (book != null)
{
XmlAttribute gid = book.Attributes["gid"];
if (gid != null)
{
string value = gid.Value;
}
}
Upvotes: 5