2011-02-24 59 views
0
<?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}并且想要过滤具有所有数据的上述文档他们的名字属性在列表中的值。如果没有找到匹配的元素,我仍然希望有一个同名和数据元素的是设置一些默认值作为元素的所有其他属性:使用LINQ to xml过滤固定的元素集,其中包含不存在的元素的默认值

<?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> 

另外,可我也只选择属性,这些属性我希望根据选择标准。

回答

0

这里是产生您发布的输出一些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");