我有一个问题。
仍在处理一个项目,但我被卡住了。
我们有这个代码:
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>
我现在怎样才能做同样的事情,但不要只是阅读分割信息来阅读来源和目的地的信息。
此外,您还可以拥有多个副本设备以及其他名称不具有源和目标值的设备
答案 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查询实际上应该是相同的。
仅修复了无效的</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];