C# 如何从xml文件中读取可变子节点?
我需要解析一个具有可变数量节点的xml配置文件,而这些节点又包含可变数量的子节点。无论有多少VM节点或vmClient节点,我如何读入所有值?我正在使用C#with VS2012来完成这个项目。 顺便说一句,如果有更好的方法来构造xml文件中的数据,请告诉我!以下是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")
我建议您使用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的长消息。我认为这是因为客户端返回的是另一个列表,而不是字符串。如何访问客户列表?