Как использовать LINQ для выбора коллекции внутренних узлов XML? - PullRequest
2 голосов
/ 04 марта 2011

У меня есть следующий xml.Учитывая, UID, Manufacturer Name и Image Layout, я хочу извлечь все возможные размеры, которые существуют в xml.

<Rules>
  <UniqueID UID="123413">
    <Manufacturer Name="XYZ Company">
      <Image Layout="Portrait">
        <Size rows="512" cols="512" price="x" />
        <Size rows="1024" cols="1024" price="y" />
      </Image>
    </Manufacturer>
  </UniqueID>
</Rules>

Способ, которым я делаю это прямо сейчас:

XElement rules = XElement.Parse(xmlDoc.OuterXml);

var uids = rules.Elements("UniqueID")
                .Where(x=> (string)x.Attribute("UID")=="123413")
                .ToList();

foreach(var uid in uids)
{
    var manufacturers = uid.Elements(("UniqueID")
                           .Where(x=> (string)x.Attribute("Name")=="XYZ Company")
                           .ToList();
}

и так далее, пока у меня не будет коллекции возможных размеров.

Поэтому я использую 3 цикла foreach.Есть ли лучший способ добиться этого с помощью, вероятно, одной строки кода, используя LINQ?

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Это немного скучно, но вы можете использовать XPathSelectElements:

 var sizes = rules.XPathSelectElements("//UniqueId[@UID = '123413']/Manufacturer[@Name = 'XYZ Company']//Size");

Очевидно, что вы можете использовать форматирование строк для динамической вставки значений для @UID и @Name.

Обязательно укажите System.Xml.XPath.

1 голос
/ 04 марта 2011

Мне нравится подход Джеймса к XPath. Вот как это может выглядеть, если вы просто продолжите укладывать LINQ.

var sizes = xmlDoc.Elements("Rules")
    .Elements("UniqueID")
    .Where(e => e.Attribute("UID").Value=="123413")
    .Elements("Manufacturer")
    .Where(e => e.Attribute("Name").Value=="XYZ Company")
    .Elements("Image")
    .Where(e => e.Attribute("Layout").Value=="Portrait")
    .Elements("Size");

sizes оказывается IEnumerable (2 элемента)

<Size rows="512" cols="512" price="x" />
<Size rows="1024" cols="1024" price="y" />
0 голосов
/ 04 марта 2011

Попробуйте это (используется XPath):

String xmlString = @"<Rules> <UniqueID UID=""123413""> <Manufacturer Name=""XYZ Company""> <Image Layout=""Portrait""> <Size rows=""512"" cols=""512"" price=""x"" /> <Size rows=""1024"" cols=""1024"" price=""y"" /> </Image> </Manufacturer> </UniqueID> </Rules>";
XElement element = XElement.Parse(xmlString);

var uids = element.XPathSelectElements("//UniqueID[@UID=123413]/Manufacturer[@Name='XYZ Company']/Image[@Layout='Portrait']/Size")
          .Select(a=> new {rows=a.Attribute("rows").Value, cols=a.Attribute("cols").Value})
        .ToList();  
foreach(var uid in uids) 
{     
    Console.WriteLine(uid.rows + " - " + uid.cols);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...