C# linq在子节点中分离xml值
我想创建一个配置文件来验证用户输入。如何访问不同的节点-该值似乎是元素中的每个节点。我想得到单独的值来检查输入的长度和正确的格式等 C# xml: 期望输出: KNR[6,######甚至更好的KNR.Length=6,KNR.Format=“#####” 有没有更好的方法来编写这样的配置?这个linq查询(C# linq在子节点中分离xml值,c#,xml,linq,C#,Xml,Linq,我想创建一个配置文件来验证用户输入。如何访问不同的节点-该值似乎是元素中的每个节点。我想得到单独的值来检查输入的长度和正确的格式等 C# xml: 期望输出: KNR[6,######甚至更好的KNR.Length=6,KNR.Format=“#####” 有没有更好的方法来编写这样的配置?这个linq查询(查询语法中的SelectMany) 尝试使用此linq查询(查询语法中的SelectMany) 用一个值来尝试它将返回所有子代文本节点,因此当您获得值时,例如KNR它将返回6 您需要单独访问
查询语法中的SelectMany
)
尝试使用此linq查询(查询语法中的SelectMany
)
用一个
值来尝试它
将返回所有子代文本节点,因此当您获得值时,例如KNR
它将返回6
您需要单独访问子元素值:
foreach(var field in xml.Element("Felder").Elements())
{
var fieldName = field.Name.LocalName;
var length = (int)field.Element("Length");
var format = (string)field.Element("Format");
// do what you want with these
// or ...
var childValues = field.Elements().Select(x => x.Value);
var childValuesCommaSeparated = string.Join("," childValues);
}
Value
将返回所有子体文本节点,因此当您获取Value
例如KNR
时,它将返回6
您需要单独访问子元素值:
foreach(var field in xml.Element("Felder").Elements())
{
var fieldName = field.Name.LocalName;
var length = (int)field.Element("Length");
var format = (string)field.Element("Format");
// do what you want with these
// or ...
var childValues = field.Elements().Select(x => x.Value);
var childValuesCommaSeparated = string.Join("," childValues);
}
如果要搜索特定节点的Xml数据以获取其子节点,可以使用。例如:
XDocument xdoc = XDocument.Load(@"C:\Project\conf\config.xml");
string sSetting = "KNF";
string sSetting = "KNR";
var result = xdoc.Descendants("Felder").Descendants()
.Where(x=>x.Name == sSetting)
.Select(x=>new {
Length = x.Element("Length").Value,
Format = x.Element("Format").Value
});
结果:
Length Format
6 ######
如果要获取每个节点的设置名称、长度和格式列表,可以尝试以下操作:
var result1 = xdoc.Descendants("Felder").Elements()
.Select(x=>new
{
Name = x.Name,
Length = x.Element("Length").Value,
Format = x.Element("Format").Value
})
.ToList();
foreach(var setting in result1)
{
Console.WriteLine("{0} | {1} | {2}",
setting.Name, setting.Length, setting.Format);
}
如果要搜索特定节点的Xml数据以获取其子节点,可以使用。例如:
XDocument xdoc = XDocument.Load(@"C:\Project\conf\config.xml");
string sSetting = "KNF";
string sSetting = "KNR";
var result = xdoc.Descendants("Felder").Descendants()
.Where(x=>x.Name == sSetting)
.Select(x=>new {
Length = x.Element("Length").Value,
Format = x.Element("Format").Value
});
结果:
Length Format
6 ######
如果要获取每个节点的设置名称、长度和格式列表,可以尝试以下操作:
var result1 = xdoc.Descendants("Felder").Elements()
.Select(x=>new
{
Name = x.Name,
Length = x.Element("Length").Value,
Format = x.Element("Format").Value
})
.ToList();
foreach(var setting in result1)
{
Console.WriteLine("{0} | {1} | {2}",
setting.Name, setting.Length, setting.Format);
}
如果我理解得很好,您希望搜索xml以找到特定的节点并获得预期的结果。我说的对吗?没错,但我最好能找到每个节点(例如,作为字典),并检查我能找到的每个值,以验证长度和格式。如果我理解得很好,您希望搜索xml以找到特定节点,并按预期得到结果。我说得对吗?没错,但我最好能得到每个节点(例如,作为字典)并检查我能找到的每个值,以验证长度和格式。但这只在任何键中有2个节点时才有效,对吗?有趣的解决方案(+1)。我将添加有关过滤Dictionary对象以返回特定值的方法的更多详细信息;)另一种方法是创建dictionary来运行每一个dictionary:foreach(keyValuePairs中的var项){your stuff here}也可以完美地工作。您可以将其添加到您的答案中。@Zoba,foreach
适用于任何IEnumerable。但好吧,我修改了fiddle@Ash如果有人遇到这个问题,这只是事后的想法。感谢您提供的解决方案,但这仅在任何键内有2个节点时才有效,对吗?有趣的解决方案(+1)。我将添加有关过滤Dictionary对象以返回特定值的方法的更多详细信息;)另一种方法是创建dictionary来运行每一个dictionary:foreach(keyValuePairs中的var项){your stuff here}也可以完美地工作。您可以将其添加到您的答案中。@Zoba,foreach
适用于任何IEnumerable。但好吧,我修改了fiddle@Ash如果有人遇到这个问题,这只是事后的想法。谢谢你的解决方案
var result1 = xdoc.Descendants("Felder").Elements()
.Select(x=>new
{
Name = x.Name,
Length = x.Element("Length").Value,
Format = x.Element("Format").Value
})
.ToList();
foreach(var setting in result1)
{
Console.WriteLine("{0} | {1} | {2}",
setting.Name, setting.Length, setting.Format);
}