фильтровать фиксированный набор элементов со значениями по умолчанию для несуществующих элементов, используя LINQ to xml - PullRequest
0 голосов
/ 24 февраля 2011
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
  <level1 name="abc1" type="xyz">   
    <data name="A" count="23" avg="56" />   
    <data name="B" count="67" avg="18" />   
    <data name="C" count="42" avg="23" />   
  </level1> 
  <level1 name="abc2" type="xyz">   
    <data name="B" count="56" avg="29" />   
    <data name="C" count="23" avg="64" />   
    <data name="E" count="78" avg="21" />   
  </level1> 
</root>

Если список фильтров равен {A, C, E, F} и вы хотите отфильтровать вышеуказанный документ со всеми данными, которые имеют значение атрибута name в списке.Если соответствующий элемент не найден, я все равно хотел бы, чтобы элемент данных с таким именем и всем другим атрибутам этих элементов был установлен на некоторые значения по умолчанию:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
  <level1 name="abc1" type="xyz">   
    <data name="A" count="23" avg="56" />   
    <data name="C" count="42" avg="23" />   
    <data name="E" count="0"  avg="0" />   
    <data name="F" count="0"  avg="0" />   
  </level1> 
  <level1 name="abc2" type="xyz">   
    <data name="A" count="0"  avg="0" />   
    <data name="C" count="23" avg="64" />   
    <data name="E" count="78" avg="21" />   
    <data name="F" count="0"  avg="0" />   
  </level1> 
</root>

Кроме того, я также могу выбрать толькоатрибуты, которые я хочу на основе критериев выбора.

1 Ответ

0 голосов
/ 25 февраля 2011

Вот пример кода C #, который выдает выложенный вывод:

    XDocument input = XDocument.Load("input.xml");
    XDocument output = new XDocument(
        new XElement(input.Root.Name,
            from level in input.Root.Elements("level1")
            select new XElement("level1",
                level.Attributes(),
                from name in new string[] { "A", "C", "E", "F" }
                let data = level.Elements("data").FirstOrDefault(d => d.Attribute("name").Value == name)
                select (data != null ? data : new XElement("data",
                    new XAttribute("name", name),
                    new XAttribute("count", 0),
                    new XAttribute("avg", 0)
                    )))));
    output.Save("output.xml");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...