简单的Linq到XML查询不起作用

时间:2010-12-16 23:01:27

标签: c# xml linq select where

我提名我为村里的白痴。

为什么这不起作用:

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="" />

我知道这会很简单,但我只是看不出我做错了什么。

感谢。

兰迪

2 个答案:

答案 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