Запрос, где parent.attribute равен некоторому значению в LINQ to XML - PullRequest
2 голосов
/ 15 января 2011

У меня есть следующий XML-документ с именем testFix.fix

<WriteFixedWidth Type="extract">
  <Position Start="1" Length="15" Name="Field1" />
  <Position Start="16" Length="8" Name="Field2" />
  <Position Start="24" Length="10" Name="Field3" />
</WriteFixedWidth>

Кроме того, следующий код

public void readXML()
{
    XDocument loaded = XDocument.Load(@"testSpec.xml");

    var q = from c in loaded.Descendants("WriteFixedWidth").Elements("Position")
            where c.Parent.Attribute("Type").ToString() == "Extract"
            select new
            {
                 Start = c.Attribute("Start").Value,
                 Length = c.Attribute("Length").Value,
                 Name = c.Attribute("Name").Value
            };

    foreach (var field in q)
        Console.WriteLine("Name is {0}, Start is {1}, Length is {2}", field.Name, field.Start, field.Length);
}

Если я удалю предложение where, я получу все поля в этомXML-документ, как и ожидалось.Однако я бы имел разные атрибуты типа для разных операций.Как мне отфильтровать данные из родительского узла?Было бы неплохо рассматривать это как один запрос, а не строить два.

1 Ответ

2 голосов
/ 15 января 2011

При доступе к атрибуту вам нужно использовать свойство Value, а не ToString().

var q = from c in loaded.Descendants("WriteFixedWidth").Elements("Position")
            where c.Parent.Attribute("Type").Value == "extract"
            select new
            {
                Start = c.Attribute("Start").Value,
                Length = c.Attribute("Length").Value,
                Name = c.Attribute("Name").Value
            };

(Также обратите внимание, что «extract» - это строчные буквы в вашем образце, но прописные в вашем запросе)

...