Question

I have the following xml:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
</catalog>

I found the title named "Midnight Rain". Now i want to know who is his parent so that i can use the <author> text node. I tried something like:

  var xpath = "../*[local-name() != 'title']";
       xml.Load(xmlalltext);
       var xl1 = xml.SelectNodes(xpath);
       MessageBox.Show(xl1.Item(0).InnerText.ToString());
Was it helpful?

Solution

If you've already found the title node and you're looking for the parent node, you can just select the parent node of the current node.

var parentNode = titleNode.SelectSingleNode("..");

If you're looking for the author node:

var authorNode = titleNode.SelectSingleNode("../author");

Alternatively, you may look for preceding or following siblings:

var authorNode = titleNode.SelectSingleNode("following-sibling::author") ?? titleNode.SelectSingleNode("preceding-sibling::author");

Edit: To answer your comment, if you only have the string of the title, then you may use the following to get the author:

string xml = @"xml...";
var doc = XDocument.Parse(xml);
string author = doc
    .Descendants("book")
    .Where(x => x.Element("title").Value == "Midnight Rain")
    .Select(x => x.Element("author").Value)
    .FirstOrDefault();

OTHER TIPS

using XLinq

sample.xml(in below snipped) contains xml data

        XElement root = XElement.Parse(File.ReadAllText("sample.xml"));

        var matchingBooks = root.Descendants().Where(i=>String.Equals(i.Value,"Midnight Rain")).Select(i=>i.Parent) ;
        var authors = matchingBooks.Elements("author");

Output in LinqPad

 matchingBooks.Dump();

authors.Dump();

<book id="bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>A former architect battles corporate zombies, 
            an evil sorceress, and her own childhood to become queen 
            of the world.</description>
        </book>

<author>Ralls, Kim</author>

You can use this xpath expession to get author node

"/catalog/book[title='Midnight Rain']/author"

or this to get parent node

"/catalog/book[title='Midnight Rain']"

eg.

 var result = xml.SelectNodes(string.Format("/catalog/book[title='{0}']/author", "Midnight Rain"))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top