Простой Linq to XML Query не работает - PullRequest
0 голосов
/ 17 декабря 2010

Я выдвигаю меня за деревенского идиота.

Почему это не работает:

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).В отладке clientField имеет атрибут n = "Номер политики".Первый элемент _sourceEntries.Descendants («Поле») также имеет атрибут n = «Номер политики».Действительно, каждый элемент в _clientXml.Descendants ("row"). Descendants () имеет соответствующую строку в _sourceEntries.Descendants ("Field").И я достаточно знаю, чтобы знать, что выбор ленив, поэтому в отладке я смотрю на блок 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 ]

1 голос
/ 17 декабря 2010

Это завершило то, что мне в конечном итоге нужно было сделать:

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, похоже, не соответствуют элементам XElements в коллекции IEnumerable. Вы можете заметить, что в исходном коде выше у меня был объект _sourceEntries. Это была коллекция, полученная из _clientTemplate.Descendants ("SourcEntries"). Descendants ("Field"). Я думал бы, что эти две формы были по существу эквивалентны для моих целей, но очевидно нет. Буду признателен, если кто-то прокомментирует этот вопрос.

Спасибо, ребята!

0 голосов
/ 17 декабря 2010

Попробуйте изменить:

where (string)sourceField.Attribute("n") == (string)clientField.Attribute("n")

Кому:

where sourceField.Attribute("n").Value == clientField.Attribute("n").Value
...