Search code examples
xmllinqxelement

query for select value in xelement


I have a XMl like this :

  <?xml version="1.0" encoding="utf-8"?>
  <Words>
     <List>
        <Cid Name="c1" ID="11">
          <Word Name="test1" ID="1">
            <Name>test1</Name>
            <Link>yahoo.com</Link>
          </Word>
        </Cid>
        <Cid Name="c2" ID="22">
          <Word Name="w0" ID="0">
            <Name>test0</Name>
            <Link>yahoo0.com</Link>
          </Word>
          <Word Name="w1" ID="1">
            <Name>test</Name>
            <Link>yahoo.com</Link>
          </Word>
          <Word Name="w1" ID="2">
            <Name>mehrdad</Name>
            <Link>google.com</Link>
          </Word>
        </Cid>
      </List>
  </Words>

I want to search for word and if node exists get name and link
So i try for search with this code

XDocument doc = XDocument.Load(data);

            var relatedDocs =
                from CatID in
                doc.Elements("Cid")
                     .Where(x => (string)x.Attribute("ID").Value == ctId.ToString())
                     .Select(x => x.Elements("Word"))
                     .Where  (What is here ? don have access to Attribute so what ?)  (x => x.Attribute("Name").Value == sName)

                     select new SelectWord {
                         NameAtt = CatID.Attribute("Name").Value,
                         IDAtt = CatID.Attribute("ID").Value,
                         Name = CatID.Element("Name").Value,
                         Link = CatID.Element("URL").Value
                     };

and this is SelectWord class

class SelectWord
        {
            public string NameAtt { get; set; }
            public string IDAtt { get; set; }
            public string Name { get; set; }
            public string Link { get; set; }
        }

and the result always is null !
I think my query is wrong, what is need for change ?


Solution

  • Please try this:

    var relatedDocs =
        from CatID in doc.Root.Element("List").Elements("Cid")
            .Where(x => x.Attribute("ID").Value == ctId.ToString())
            .SelectMany(x => x.Elements("Word")
                .Where(w => w.Attribute("Name").Value == sName))
        select new SelectWord
        {
            NameAtt = CatID.Attribute("Name").Value,
            IDAtt = CatID.Attribute("ID").Value,
            Name = CatID.Element("Name").Value,
            Link = CatID.Element("Link").Value
        };