问题
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>
?
回答1:
@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;
来源:https://stackoverflow.com/questions/15903671/how-can-i-access-a-single-xml-elements-value-using-c-net-web-pages-with-webmat