Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
C# 如何从xml文件中读取可变子节点?_C#_Xml_Xml Parsing - Fatal编程技术网

C# 如何从xml文件中读取可变子节点?

C# 如何从xml文件中读取可变子节点?,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我需要解析一个具有可变数量节点的xml配置文件,而这些节点又包含可变数量的子节点。无论有多少VM节点或vmClient节点,我如何读入所有值?我正在使用C#with VS2012来完成这个项目。 顺便说一句,如果有更好的方法来构造xml文件中的数据,请告诉我!以下是xml文件: 我建议您使用LINQ转换XML var xdoc = XDocument.Load(path_to_xml); var query = from vm in xdoc.Descendants("VM")

我需要解析一个具有可变数量节点的xml配置文件,而这些节点又包含可变数量的子节点。无论有多少VM节点或vmClient节点,我如何读入所有值?我正在使用C#with VS2012来完成这个项目。 顺便说一句,如果有更好的方法来构造xml文件中的数据,请告诉我!以下是xml文件:



我建议您使用LINQ转换XML

var xdoc = XDocument.Load(path_to_xml);
var query = from vm in xdoc.Descendants("VM")
            select new {
               Name = (string)vm.Attribute("name"),
               Language = (string)vm.Element("vmLanguage").Attribute("value"),
               Snapshot = (string)vm.Element("vmSnapshot").Attribute("value"),
               PowerOn = (bool)vm.Element("vmPowerOn").Attribute("value"),
               Clients = from c in vm.Element("vmClients").Elements()
                         select new {
                            Name = (string)c.Attribute("name"),
                            // etc
                         }
            };
我还建议您直接将值存储为元素值,或存储在属性中,因此

Language = (string)vm.Element("vmLanguage").Attribute("value")
您将能够使用(如果缺少某些元素,您也不会得到异常)

前缀
vm
在我看来有点奇怪。如果它是
vm
数据的一部分,为什么不直接使用
语言呢?因此,我将采用以下配置:

<vm name="DE2008" language="de" shapshot="test" powerOn="true">
    <clients>
        <client name="ITXPPRO" snapshot="test2" language="it"/>
        <client name="ITXPPRO" snapshot="test3" language="jp"/>
    </clients>
</vm>

我建议您使用LINQ to XML

var xdoc = XDocument.Load(path_to_xml);
var query = from vm in xdoc.Descendants("VM")
            select new {
               Name = (string)vm.Attribute("name"),
               Language = (string)vm.Element("vmLanguage").Attribute("value"),
               Snapshot = (string)vm.Element("vmSnapshot").Attribute("value"),
               PowerOn = (bool)vm.Element("vmPowerOn").Attribute("value"),
               Clients = from c in vm.Element("vmClients").Elements()
                         select new {
                            Name = (string)c.Attribute("name"),
                            // etc
                         }
            };
我还建议您直接将值存储为元素值,或存储在属性中,因此

Language = (string)vm.Element("vmLanguage").Attribute("value")
您将能够使用(如果缺少某些元素,您也不会得到异常)

前缀
vm
在我看来有点奇怪。如果它是
vm
数据的一部分,为什么不直接使用
语言呢?因此,我将采用以下配置:

<vm name="DE2008" language="de" shapshot="test" powerOn="true">
    <clients>
        <client name="ITXPPRO" snapshot="test2" language="it"/>
        <client name="ITXPPRO" snapshot="test3" language="jp"/>
    </clients>
</vm>

您的应用程序只需使用类似的内容即可

    XDocument xDocument = XDocument.Load(yourconfigfilepath);


            var firstresult = xDocument.Descendants("VM");
foreach (var elt in result)
            {
                var childforeachNode = xDocument.Descendants("vmClient");

            }

你可以用这样的东西

    XDocument xDocument = XDocument.Load(yourconfigfilepath);


            var firstresult = xDocument.Descendants("VM");
foreach (var elt in result)
            {
                var childforeachNode = xDocument.Descendants("vmClient");

            }

你试过什么?您看过使用Linq2Xml吗?此外,一个文档中不能有多个xml根。如果结构没有改变(经常),我建议您反序列化它,然后只迭代“常规”对象。看看拉兹别列佐夫斯基的答案,你试过什么?您看过使用Linq2Xml吗?此外,一个文档中不能有多个xml根。如果结构没有改变(经常),我建议您反序列化它,然后只迭代“常规”对象。检查lazyberezovsky的答案。谢谢你的回答。我将按照你的建议去做。很抱歉,我是LINQ新手-如何从查询中提取节点属性?我必须把它转换成列表还是什么?非常感谢您的时间和帮助。@bearaman此查询返回匿名类型的序列。您可以在foreach中枚举它们,也可以使用
var vms=query.ToList()
call转换为list。然后您将能够通过索引
vms[0]获取项目。语言
非常感谢,回答得很好。@bearaman还有一个注释-匿名键入此处仅用于示例。您可以创建
VM
VMClient
类,并返回这些类的实例,而不是匿名类型。最后一件事是,当我执行foreach循环查询时,我会得到VM的结果,但不会得到客户机的结果,这会给我一条关于Linq的长消息。我认为这是因为客户端返回的是另一个列表,而不是字符串。我怎样才能访问客户名单?谢谢你的回答。我将按照你的建议去做。很抱歉,我是LINQ新手-如何从查询中提取节点属性?我必须把它转换成列表还是什么?非常感谢您的时间和帮助。@bearaman此查询返回匿名类型的序列。您可以在foreach中枚举它们,也可以使用
var vms=query.ToList()
call转换为list。然后您将能够通过索引
vms[0]获取项目。语言
非常感谢,回答得很好。@bearaman还有一个注释-匿名键入此处仅用于示例。您可以创建
VM
VMClient
类,并返回这些类的实例,而不是匿名类型。最后一件事是,当我执行foreach循环查询时,我会得到VM的结果,但不会得到客户机的结果,这会给我一条关于Linq的长消息。我认为这是因为客户端返回的是另一个列表,而不是字符串。如何访问客户列表?