views:

59

answers:

2

If I get the path to a specific node as a string can I somehow easily find said node by using Linq/Method of the XElement ( or XDocument ).

There are so many different types of XML objects it would also be nice if as a added bonus you could point me to a guide on why/how to use different types.

EDIT: Ok after being pointed towards XPathSelectElement I'm trying it out so I can give him the right answer I can't quite get it to work though. This is the XML I'm trying out

<Product>
  <Name>SomeName</Name>
  <Type>SomeType</Type>
  <Quantity>Alot</Quantity>
</Product>

and my code

string path = "Product/Name";
string name = xml.XPathSelectElement(path).Value;

note my string is coming from elsewhere so I guess it doesn't have to be literal ( at least in debug mode it looks like the one above). I've also tried adding / in front. It gives me a null ref.

+2  A: 

Try using the XPathSelectElement extension method of XElement. You can pass the method an XPath expression to evaluate. For example:

XElement myElement = rootElement.XPathSelectElement("//Book[@ISBN='22542']");

Edit:

In reply to your edit, check your XPath expression. If your document only contains that small snippet then /Product/Name will work as the leading slash performs a search from the root of the document:

XElement element = document.XPathSelectElement("/Product/Name");

If there are other products and <Product> is not the root node you'll need to modify the XPath you're using.

nukefusion
I couldn't get it to recognize XPathSlectElement until I manually added the Using statement. However It isn't working as I hoped. Could you tell me what's wrong ( see edit above ) so I can give you accepted answer?
Ingó Vals
The variable named xml is just that part I mentioned but it's a part of a bigger XML tree and this part was passed in as parameter. If I check the xml variable in debug mode it shows the product XML above. I also tried putting in the original Xpath and it doesn't work either.
Ingó Vals
Ok finally got it to work by using ("./Name")
Ingó Vals
+1  A: 

You can also use XPathEvaluate

XDocument document = XDocument.Load("temp.xml");
var found = document.XPathEvaluate("/documents/items/item") as IEnumerable<object>;
foreach (var obj in found)
{
    Console.Out.WriteLine(obj);    
}

Given the following xml:

<?xml version="1.0" encoding="utf-8" ?>
<documents>
  <items>
    <item name="Jamie"></item>
    <item name="John"></item>
  </items>
</documents>

This should print the contents from the items node.

stephenlloyd
This might come in handy when you have many with same name, thank you.
Ingó Vals