2010-12-16 3 views
0

Я назначаю меня для деревенского идиота.Простой запрос Linq to XML

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

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 = «Номер политики». Первый элемент _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="" /> 

Я знаю, что это будет что-то простое , но я просто не понимаю, что я делаю неправильно.

Спасибо.

Рэнди

+0

Ваш Console.Write имеет странную строку формата Console.WriteLine «Имя поля: {0}» с одним аргументом, но вы передаете 2 ... Предполагая, что вы хотите видеть оба они не должны быть «Имя поля: {0 }, значение {1} "? – 2010-12-16 23:13:03

+0

@ EoRaptor13 в _clientXml - это дескриптор узла или строка строки? – 2010-12-16 23:21:07

+0

Julian, row, в нижнем регистре. Alexi, извините, забыли добавить второй аргумент в Writeline. У меня было двое, но когда это не сработало, попробуйте сделать это проще, только написав один. Еще нет радости. Спасибо, что посмотрели на него. – EoRaptor013 2010-12-17 01:16:31

ответ

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

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

0

Try изменения:

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

To:

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