I have an xml document that have nodes like this, <ITEM id="1" name="bleh"... />
What I want to do is get all id's attribute value for each ITEM node that exists in the document.
Edit: I've tried this way and it didn't works:
XmlDocument Doc = new XmlDocument();
Doc.Load("example.xml");
XmlNodeList nodeList = Doc.SelectNodes("/ITEM");
foreach (XmlNode node in nodeList)
{
string id = node.Attributes["id"].Value;
Console.WriteLine(id);
}
You should use XmlNamespaceManager in your call to SelectSingleNode() since your XML does contain a namespace on it:
var doc = new XmlDocument();
doc.Load("example.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("anyname", "http://tempuri.org/zitem.xsd");
foreach (XmlNode node in doc.SelectNodes("//anyname:ITEM", ns))
{
Console.WriteLine(node.Attributes["id"].Value);
}
That's why you get no result.
The difference from my code to yours is that I am using //
so instead of starting at the root of a document, a double forward slash //
indicates to an XPath
evaluator to look anywhere in an XML document.
Here is my example.xml
as sample:
<root>
<items>
<ITEM id="1" name="bleh=" />
<ITEM id="2" name="bleh=" />
<ITEM id="3" name="bleh=" />
<ITEM id="4" name="bleh=" />
<ITEM id="5" name="bleh=" />
<ITEM id="6" name="bleh=" />
<ITEM id="7" name="bleh=" />
<ITEM id="8" name="bleh=" />
</items>
</root>
And here is how I am reading it:
var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode node in doc.SelectNodes("//ITEM[@id]"))
{
Console.WriteLine(node.Attributes["id"].Value);
}
With single slash, the above XPath
would look like this:
/root/items/ITEM
I am also using [@id]
to ensure that the ITEM
element have an ID
attribute but that is not necessary if you know they all have an ID
attribute.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With