Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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# 如何使用XDocument和Linq读取与子注释连接的父属性列表_C#_Xml_Linq_Parsing_Xml Parsing - Fatal编程技术网

C# 如何使用XDocument和Linq读取与子注释连接的父属性列表

C# 如何使用XDocument和Linq读取与子注释连接的父属性列表,c#,xml,linq,parsing,xml-parsing,C#,Xml,Linq,Parsing,Xml Parsing,我是Linq和XDocument的新手,在任何地方都找不到类似的解决方案问题,因此: 以下是我试图解析的XML: <environment> <objectBuilder> <service id="1"> <!--Service:"MagicService"> </service> <service id="2"> <!--Service:"RubbishService"> <

我是Linq和XDocument的新手,在任何地方都找不到类似的解决方案问题,因此:

以下是我试图解析的XML:

<environment>
 <objectBuilder>
  <service id="1">
   <!--Service:"MagicService">
  </service>
  <service id="2">
   <!--Service:"RubbishService">
  </service>
  <service id="3">
   <!--Service:"MediocreService">
  </service>
 </objectBuilder>
</environment>
我已经尝试将注释和ID读入两个不同的列表,然后将它们组合起来,但这不是一个足够好的解决方案,因为在我的实际问题中,可能存在没有注释名称的服务

我当前的解决方案如下所示:

List<string> comments = doc.Elements("Environment")
                        .Elements("objectBuilder")
                        .Elements("service")
                        .Nodes()
                        .OfType<XComment>()
                        .Select(c => c.Value)
                        .Where(c=> c.StartsWith("Service"))
                        .ToList());

List<string> serviceGuides = doc.Elements("Environment")
                        .Elements("objectBuilder")
                        .Elements("service")
                        .Attributes(XName.Get("id"))
                        .Select(c => c.Value)
                        .ToList());
列表注释=文档元素(“环境”)
.Elements(“objectBuilder”)
.要素(“服务”)
.Nodes()
第()类
.选择(c=>c.Value)
.其中(c=>c.StartsWith(“服务”))
.ToList());
列表服务指南=文档元素(“环境”)
.Elements(“objectBuilder”)
.要素(“服务”)
.Attributes(XName.Get(“id”))
.选择(c=>c.Value)
.ToList());
然后我通过一个for循环,如果列表的大小相同,我会将它们连接起来。必须有一个更优雅的解决方案吗


感谢您的帮助,如果这是一个重复/愚蠢的问题,很抱歉这是一种可能的方法:

var result = (from service in doc.Elements("environment")
                                 .Elements("objectBuilder")
                                 .Elements("service")
                     //get service id attribute
              select (string)service.Attribute("id")
                      + " " +
                     //get the first comment node which value starts with "Service"
                     //and then extract the value between first quotes pair
                      service.Nodes()
                             .OfType<XComment>()
                             .Select(c => c.Value)
                             .FirstOrDefault(c => c.StartsWith("Service"))
                             .Split('"')[1]
             ).ToList();

foreach (var r in result)
{
    Console.WriteLine(r);
}
1 MagicService
2 RubbishService
3 MediocreService
这应该行得通

var serviceElements = xDoc.Elements("environment")
    .Elements("objectBuilder")
    .Elements("service")                
    .ToList();

var result = (from element in serviceElements
    let attribute = element.Attribute("id").Value
    let name = element
        .Nodes()
        .OfType<XComment>()
        .Select(c => c.Value)
        .FirstOrDefault(c => c.StartsWith("Service"))
        .Split('"')[1]
    select string.Format("{0} {1}", attribute, name)).ToList();
var servicelements=xDoc.Elements(“环境”)
.Elements(“objectBuilder”)
.要素(“服务”)
.ToList();
var result=(来自serviceElements中的元素
让attribute=element.attribute(“id”).Value
让name=元素
.Nodes()
第()类
.选择(c=>c.Value)
.FirstOrDefault(c=>c.StartsWith(“服务”))
.Split(“”)[1]
选择string.Format(“{0}{1}”,属性,名称)).ToList();

非常适合这种情况。您可以编写循环,resharper将帮助您将其转换为linq。您可以轻松地组合上述两个表达式。您可能还需要添加空引用检查。

谢谢各位,我将在周一试用这些。我严重怀疑,如果不大量阅读linq,我是否会得到这些又是汉克斯。这两个章节都很有效,我从你的答案中学到了很多,谢谢。
var serviceElements = xDoc.Elements("environment")
    .Elements("objectBuilder")
    .Elements("service")                
    .ToList();

var result = (from element in serviceElements
    let attribute = element.Attribute("id").Value
    let name = element
        .Nodes()
        .OfType<XComment>()
        .Select(c => c.Value)
        .FirstOrDefault(c => c.StartsWith("Service"))
        .Split('"')[1]
    select string.Format("{0} {1}", attribute, name)).ToList();