I've looked at a lot of resources, done a lot of research, and tried many "best-guesses" to access a single element at a time using WebMatrix with C#, web-pages, however nothing I am trying is getting through.
Consider a simple xml document that looks like this:
<root>
<requisitionData>
<element1>I am element 1</element1>
<element2>I am element 2</element2>
</requisitionData>
</root>
I know I can use a foreach loop, like so:
@using System.Xml.Linq
XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml"));
foreach (XElement element in doc.Descendants("requisitionData"))
{
@element.Value
}
And that, of course, works fine. But what if I simply wanted to store the single element, <element1>
's value in a string variable?
I've looked here (link below), but I can't make heads or tails of this code (it barely even looks like C# to me, but then again, I'm so new to parsing XML...):
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b14ce4d1-77f1-420d-ad91-0989794a1d45/
I've also checked here: How to Get XML Node from XDocument
But the code shown makes no sense to me here either. I keep thinking there must be a simpler way to do this, hopefully without learning a whole new querying approach.
---------------------------------THINGS I'VE TRIED---------------------------------
XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml"));
string element = doc.Descendants("requisitionData").Descendants("element1").Value;
Error I receive: "missing using directive or assembly reference
XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml"));
XElement element = doc.Descendants("element1");
string val = element.Value;
Error I receive: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Xml.Linq.XElement'. An explicit conversion exists (are you missing a cast?)
I have, indeed, tried other things, but I get pretty much the same errors as shown above. Am I making this harder than it is, or am I oversimplifying it?
-------------------------UPDATE------------------------------
I was able to get this to work:
string element = doc.Element("root").Element("requisitionData").Element("element1").Value;
@element
However, one thing that concerns me about this approach is that .Element
selects the 'first' match, so in an xml document that looks like this:
<root>
<requisitionData>
<element1>I am element 1</element1>
<element2>I am element 2</element2>
</requisitionData>
<requisitionData>
<element1>I am element 1</element1>
<element2>I am element 2</element2>
</requisitionData>
</root>
How could I access the second occurrence of <element1>
?
Select XML Nodes by Name [C#] To find nodes in an XML file you can use XPath expressions. Method XmlNode. SelectNodes returns a list of nodes selected by the XPath string. Method XmlNode.
An XML Element is the basic construct within an XML Document. An XML Element may contain text, Attributes, other Elements as well as Entity References, CDATA and Processing Instructions, this allows complex hierarchical data to be described.
@using System.Xml.Linq
XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml"));
foreach (XElement element in doc.Element("root").Element("requisitionData").Descendants())
{
string value = element.Value;
}
or with XPath:
@using System.Xml.Linq
@using System.Xml.XPath
XDocument doc = XDocument.Load(Server.MapPath("~/User_Saves/cradebaugh/testFile.xml"));
foreach (XElement element in doc.XPathSelectElement("//requisitionData").Descendants())
{
string value = element.Value;
}
UPDATE:
And if you wanted to select for example the second <element1>
node from your updated example:
string value = doc.XPathSelectElement("//requisitionData[2]/element1").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