Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在C语言中向嵌套字典添加值#_Xml_Linq_C# 3.0 - Fatal编程技术网

Xml 在C语言中向嵌套字典添加值#

Xml 在C语言中向嵌套字典添加值#,xml,linq,c#-3.0,Xml,Linq,C# 3.0,我有一个如下结构的XML文件 <Root> <Child Name="First"> <Data Name="a" val="0"/> <Data Name="b" val="1"/> <Data Name="c" val="20"/> <Data Name="d" val="10"/> <Data Name="e" val="

我有一个如下结构的XML文件

<Root>
    <Child Name="First">
        <Data Name="a" val="0"/>
         <Data Name="b" val="1"/>
        <Data Name="c" val="20"/>
        <Data Name="d" val="10"/>
         <Data Name="e" val="2"/>
         <Data Name="f" val="0"/>
         <Data Name="g" val="0"/>
         <Data Name="h" val="0"/>
    </Child>
    <Child Name="Second">
        <Data Name="a" val="0"/>
         <Data Name="b" val="0"/>
         <Data Name="c" val="0"/>
         <Data Name="d" val="0"/>
         <Data Name="e" val="0"/>
         <Data Name="f" val="0"/>
         <Data Name="g" val="50"/>
        <Data Name="h" val="30"/>
    </Child>
</Root>
我只需要添加“val”属性值不等于零的数据元素

现在我使用嵌套for循环来实现这一点


有什么方法可以使用XML来实现这一点吗?

有点长,但是。。。你能做什么

XElement root = XElement.Parse(xml);

var dict = root.Elements("Child")
    .ToDictionary(
        child => child.Attribute("Name").Value,
        child => child.Elements("Data")
            .Where(data => data.Attribute("val").Value != "0")
            .ToDictionary(
                data => data.Attribute("Name").Value,
                data => data.Attribute("val").Value
            )
    );

下面是一种方法:

string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    select new
    {
        Name = child.Attribute("Name").Value,
        Data = child.Elements("Data")
                    .Where(data => data.Attribute("val").Value != "0")
                    .ToDictionary(
                        data => data.Attribute("Name").Value,
                        data => data.Attribute("val").Value)
    };
var dict = query.ToDictionary(child => child.Name, child => child.Data);
还有一个:

string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    from data in child.Elements("Data")
    where data.Attribute("val").Value != "0"
    group data by child.Attribute("Name").Value;

var dict = q2.ToDictionary(
            g => g.Key,
            g => g.ToDictionary(
                    data => data.Attribute("Name").Value,
                    data => data.Attribute("val").Value));

挑你喜欢的;)

您应该使用元素而不是子元素,因为您知道“Child”元素是根的直接子元素。@Thomas:听起来不错。(实际上,我不太了解LINQ到XML;我只是想知道如何用一种通用的LINQ方式解决这个问题,所以我给出了一个答案。)
string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    select new
    {
        Name = child.Attribute("Name").Value,
        Data = child.Elements("Data")
                    .Where(data => data.Attribute("val").Value != "0")
                    .ToDictionary(
                        data => data.Attribute("Name").Value,
                        data => data.Attribute("val").Value)
    };
var dict = query.ToDictionary(child => child.Name, child => child.Data);
string path = @"E:\tmp\test.xml";
var doc = XDocument.Load(path);
var query =
    from child in doc.Root.Elements("Child")
    from data in child.Elements("Data")
    where data.Attribute("val").Value != "0"
    group data by child.Attribute("Name").Value;

var dict = q2.ToDictionary(
            g => g.Key,
            g => g.ToDictionary(
                    data => data.Attribute("Name").Value,
                    data => data.Attribute("val").Value));