2011-02-24 13 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");