How can i get the parent of node text value in c#?

6k views Asked by At

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());
3

There are 3 answers

1
nivlam On BEST ANSWER

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();
0
Tilak On

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>
0
userx01233433 On

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"))