I have two methods:
I have two alternative implementations of 'GetBananaId(XElement element)' - can anyone explain why the second 'wrong' implementation doesn't give the child element relative to its XElement parameter?
public void TestHarness()
{
var xml = "<bananas><banana><id>A</id></banana><banana><id>B</id></banana><banana><id>C</id></banana></bananas>";
foreach (var element in GetBananaElements(xml))
{
var right = GetBananaId(element);
var wrong = GetBananaId_WRONG(element);
Console.WriteLine("Right: {0}, Wrong: {1}", right, wrong);
}
}
public IEnumerable<XElement> GetBananaElements(string recordsXml)
{
var recordsXDoc = XDocument.Parse(recordsXml);
return recordsXDoc.XPathSelectElements("//banana");
}
public string GetBananaId(XElement element)
{
return element.Element("id").Value;
}
public string GetBananaId_WRONG(XElement element)
{
return element.XPathSelectElement("//id").Value;
}
These produce the console output:
Right: A, Wrong: A
Right: B, Wrong: A
Right: C, Wrong: A
Use a relative path return element.XPathSelectElement("id").Value;
, with //id
you search down from /
which is the document node.