我提名我为村里的白痴。
为什么这不起作用:
foreach (XElement clientField in _clientXml.Descendants("row").Descendants())
{
var newFieldName =
from sourceField in _sourceEntries.Descendants("Field")
where (string)sourceField.Attribute("n") == (string)clientField.Attribute("n")
select new
{
FieldName = ((string) sourceField.Attribute("n")),
AcordRef = ((string) sourceField.Attribute("m"))
};
foreach (var element in newFieldName)
{
Console.WriteLine("Field Name: {0}",
element.FieldName, element.AcordRef);
}
}
我的源XML文件加载了XElement.Load(myFileName)。在debug中,clientField具有属性n =“Policy Number”。 _sourceEntries.Descendants(“Field”)的第一个元素也有一个属性n =“Policy Number”。实际上,_clientXml.Descendants(“row”)中的每个元素.Descendants()在_sourceEntries.Descendants(“Field”)中都有一个匹配的行。而且,我知道只是知道select是懒惰的,所以在调试中我看一下Console.WriteLine块。无论我尝试过什么,newFieldName都是空集。
以防万一,这是客户端文件的第一个元素:
<Column_0 n="Policy Number">ABC000123</Column_0>
而且,这是_sourceEntries集合的第一个元素:
<Field n="Policy Number" c="1" l="" s="" cd="" m="1805" f="" />
我知道这会很简单,但我只是看不出我做错了什么。
感谢。
兰迪
答案 0 :(得分:1)
这完成了我最终需要做的事情:
foreach (var clientField in _clientXml.Descendants("row").Descendants())
{
foreach (var acordMapRef in
from sourceEntry in _clientTemplate.Descendants("SourceEntries").Descendants("Field")
where (string) clientField.Attribute("n") == (string) sourceEntry.Attribute("n")
from acordMapRef in _clientTemplate.Descendants("Acord").Descendants("Field")
where (string) sourceEntry.Attribute("m") == (string) acordMapRef.Attribute("id")
select acordMapRef)
{
clientField.Attribute("n").Value = (string) acordMapRef.Attribute("n");
}
}
但是,它肯定是本月最丑陋代码的候选人。我在愚弄时注意到的一件事是,XElement树中的元素似乎与IEnumerable集合中的XElements不匹配。你可能会注意到上面的原始代码,我有一个对象_sourceEntries。这是一个派生自_clientTemplate.Descendants(“SourcEntries”)的集合.Scecendants(“Field”)。我原以为这两种形式基本上与我的目的相同,但显然不是。我很感激有人评论这个问题。
谢谢大家!
答案 1 :(得分:0)
尝试更改:
where (string)sourceField.Attribute("n") == (string)clientField.Attribute("n")
要:
where sourceField.Attribute("n").Value == clientField.Attribute("n").Value