Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access a single XML element's value using C#.net web-pages with WebMatrix?

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>?

like image 386
VoidKing Avatar asked Apr 09 '13 13:04

VoidKing


People also ask

How do I select a specific node in XML?

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.

What is element content in XML?

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.


1 Answers

@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;
like image 194
Darin Dimitrov Avatar answered Sep 20 '22 22:09

Darin Dimitrov