Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# linq在子节点中分离xml值_C#_Xml_Linq - Fatal编程技术网

C# linq在子节点中分离xml值

C# linq在子节点中分离xml值,c#,xml,linq,C#,Xml,Linq,我想创建一个配置文件来验证用户输入。如何访问不同的节点-该值似乎是元素中的每个节点。我想得到单独的值来检查输入的长度和正确的格式等 C# xml: 期望输出: KNR[6,######甚至更好的KNR.Length=6,KNR.Format=“#####” 有没有更好的方法来编写这样的配置?这个linq查询(查询语法中的SelectMany) 尝试使用此linq查询(查询语法中的SelectMany) 用一个值来尝试它将返回所有子代文本节点,因此当您获得值时,例如KNR它将返回6 您需要单独访问

我想创建一个配置文件来验证用户输入。如何访问不同的节点-该值似乎是元素中的每个节点。我想得到单独的值来检查输入的长度和正确的格式等

C#

xml:

期望输出: KNR[6,######甚至更好的KNR.Length=6,KNR.Format=“#####”

有没有更好的方法来编写这样的配置?

这个linq查询(
查询语法中的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);
}