Найти родителя из атрибута потомка xml linq? - PullRequest
0 голосов
/ 11 февраля 2010

Я пытаюсь захватить элементы с дочерним дочерним атрибутом == значение

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load(@"path to doc");
        var query = from q in doc.Elements("Candidates").Elements("Candidates")
                    //How to filter based on descendant attribute value
                    where (string)q.Descendants("CandidatesPropertyValue")
                    .Attributes["PropertyValue"] != "Consumer Sales & Information"
                    //? this doesn't work obviously
                    select q;
        string type;
        string val;
        foreach (var record in query)
        {
            foreach (XAttribute a in record.Element("Candidates").Attributes())
            {
                Console.WriteLine("{0} = \"{1}\"", a.Name.ToString(), a.Value.ToString());
            }
            foreach (XElement e in record.Descendants())
            {
                type = (string)e.Attribute("PropertyType").Value;
                val = (string)e.Attribute("PropertyValue").Value;
                Console.WriteLine("     {0} = \"{1}\"", type, val);
            }
        }
        Console.ReadLine();
    }

<CandidatesRoot>
      I WANT THIS ELEMENT
- <Candidates ...bunch of attributes...>
  <CandidatesPropertyValue PropertyType="Type1" PropertyValue="Value1" /> 
  <CandidatesPropertyValue PropertyType="Type2" PropertyValue="Value2" /> 
  <CandidatesPropertyValue PropertyType="Type3" PropertyValue="Value3" /> 
  <CandidatesPropertyValue PropertyType="Type4" PropertyValue="Value4" /> 
  <CandidatesPropertyValue PropertyType="Type5" PropertyValue="Value5" /> 
  </Candidates>
      BUT I DON'T WANT THIS ONE
- <Candidates ...bunch of attributes...>
  <CandidatesPropertyValue PropertyType="Type1" PropertyValue="Value1" />
  <CandidatesPropertyValue PropertyType="LineOfBusiness" PropertyValue="Consumer Sales & Information" />
  <CandidatesPropertyValue PropertyType="Type2" PropertyValue="Value2" /> 
  <CandidatesPropertyValue PropertyType="Type3" PropertyValue="Value3" /> 
  <CandidatesPropertyValue PropertyType="Type4" PropertyValue="Value4" /> 
  <CandidatesPropertyValue PropertyType="Type5" PropertyValue="Value5" /> 
  </Candidates>

Ответы [ 3 ]

2 голосов
/ 12 февраля 2010

Вы можете использовать XPath

using System.Xml.XPath;

...
String val = "\"Consumer Sales & Information\"";
String xpath = String.Format(".//CandidatesPropertyValue[@PropertyValue= {0}]", val);
doc.XPathSelectElements(xpath);
1 голос
/ 12 февраля 2010

Я рискну предположить и скажу, что вам нужно изменить его на:

where (string)q.Descendants("CandidatesPropertyValue")
    .Attributes("PropertyValue").SingleOrDefault()

если ему нужен хотя бы один потомок без этого значения:

where q.Descendants("CandidatesPropertyValue")
    .Attributes("PropertyValue")
    .Any(a => a.Value != "Consumer Sales & Information")
0 голосов
/ 12 февраля 2010

Поиск всех элементов с именем Candidates, у которых есть хотя бы один потомок с именем CandidatesPropertyValue и хотя бы один атрибут с именем PropertyValue со значением "Consumer Sales & Information":

var query = from q in doc.Elements("Candidates").Elements("Candidates")
            where q.Descendants("CandidatesPropertyValue")
                   .Any(p => p.Attributes("PropertyValue")
                       .Any(a => a.Value == "Consumer Sales & Information"))
            select q;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...