C#Linq获得了后代的价值

时间:2016-06-14 07:01:39

标签: c# xml linq

我有一个问题。

仍在处理一个项目,但我被卡住了。

我们有这个代码:

    var copyitems = doc.Descendants(application)   // Read all descendants    
        .SelectMany(x => x.Elements("Test"))
        .Select(s =>
        {
            var splits = s.Value.Split(new string[] { "@SRCDIR@", "@INSTDIR@" }, StringSplitOptions.RemoveEmptyEntries); // split the string to separate source and destination.
            return new { Source = splits[0].Replace(",", ""), Destination = splits[1].Replace(",", "") };
        })
        .ToList();

与此xml示例结合使用:

<root>
<Test>
    <Copy>@SRCDIR@\test1 ,@INSTDIR@\test1</Copy>
</Test>
<root>

但是xml现在改为:

<root>
<Test>
   <Copy>
        <Source>@SRCDIR@\test</Source>
        <Destination>@INSTDIR@\test1</Destination>
   </Copy>
</Test>
<root>

我现在怎样才能做同样的事情,但不要只是阅读分割信息来阅读来源和目的地的信息。

此外,您还可以拥有多个副本设备以及其他名称不具有源和目标值的设备

3 个答案:

答案 0 :(得分:1)

查找接受元素名称作为输入的Element方法。

var copyitems = doc.Descendants(application)   // Read all descendants    
    .SelectMany(x => x.Elements("Test"))
    .Select(s =>
    {
        return new 
               { 
                     Source = s.Element("Source").Value.Replace("@SRCDIR@", ""),
                     Destination =s.Element("Destination").Value.Replace("@INSTDIR@", "") 
               };
    })
    .ToList();

答案 1 :(得分:1)

对于两个Xml(至少在你的问题中显示的那些),你的linq查询实际上应该是相同的。

I just tested it

仅修复了无效的</root>,linq代码(我删除了application,因为我们没有)完全相同

如果您的Xml不同,请在您的代码无法使用的位置显示

请注意,element.Value仅包含非标记,因此对于您要分割的第一个Xml@SRCDIR@\test1 ,@INSTDIR@\test2,在第二个示例中,您将分割{{1}但是,由于分隔符是一致的,它只是起作用。

答案 2 :(得分:1)

您只需要做一些小改动,但仍然使用Split方法。只需在分隔符列表中添加逗号即可。

var separators = new string[] { "@SRCDIR@", "@INSTDIR@", "," };
var tokens = s.Value.Split(separators, StringSplitOptions.RemoveEmptyEntries);
var source = tokens[0];
var destination = tokens[1];