Lets say I have the following xml (a quick example)
<rows>
<row>
<name>one</name>
</row>
<row>
<name>two</name>
</row>
</rows>
I am trying to parse this by using XmlDocument and XPath (ultimately so I can make a list of rows).
For example...
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach(XmlNode row in doc.SelectNodes("//row"))
{
string rowName = row.SelectSingleNode("//name").InnerText;
}
Why, within my foreach loop, is rowName always "one"? I am expecting it to be "one" on the first iteration and "two" on the second.
It seems that //name gets the first instance in the document, rather than the first instance in the row as I would expect. After all, I am calling the method on the "row" node. If this is "just how it works" then can anybody please explain how I could change it to work to my needs?
Thank you
It defines a language to find information in an XML file. It is used to traverse elements and attributes of an XML document.
XPath uses path expressions to select nodes or node-sets in an XML document. These path expressions look very much like the expressions you see when you work with a traditional computer file system. XPath expressions can be used in JavaScript, Java, XML Schema, PHP, Python, C and C++, and lots of other languages.
The XML Path Language (XPath) is used to uniquely identify or address parts of an XML document. An XPath expression can be used to search through an XML document, and extract information from any part of the document, such as an element or attribute (referred to as a node in XML) in it.
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach(XmlNode row in doc.SelectNodes("//row"))
{
var rowName = row.SelectSingleNode("name");
}
Is the code you posted actually correct? I get a compile error on row.SelectNode() as it isn't a member of XmlNode.
Anyway, my example above works, but assumes only a single <name>
node within the <row>
node so you may need to use SelectNodes()
instead of SelectSingleNode()
if that is not the case.
As others have shown, use .InnerText
to get just the value.
Use LINQ to XML. Include using System.Xml.Linq;
in your code file and then do the following code to get your list
XDocument xDoc = XDocument.Load(filepath);
IEnumerable<XElement> xNames;
xNames = xDoc.Descendants("name");
That will give you a list of the name elements. Then if you want to turn that into a List<string>
just do this:
List<string> list = new List<string>();
foreach (XElement element in xNames)
{
list.Add(element.value);
}
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