2016-06-27 3 views
0

Прошу прощения за продвинутый, если этот вопрос повторен, но из моего поиска не было никаких подходящих ответов для моей конкретной ошибки.XElement Узлы и дочерние узлы

Так что на вопрос, у меня в настоящее время есть документ Excel с несколькими строками XML в листе распространения. В настоящее время я создаю консольное приложение в C#, чтобы затем отфильтровать XML в читаемые данные. В настоящее время я могу извлечь содержимое документов, и теперь я запускаю код для разбивки данных.

Так что для структуры XML:

XML-имеет несколько полей, в каждой области есть метка и значение поле. Поэтому я взял маршрут для создания списка всех узлов (например, полей) и попытаюсь извлечь данные с помощью XElement. Также я знаю все ярлыки, поэтому я буду использовать эти метки, чтобы попытаться собрать значения.

foreach(DataRow row in result.Tables[0].Rows) 
    { 
     var XmlData = row.ItemArray[2].ToString(); 
     XElement doc = XElement.Parse(XmlData); 
     foreach (XElement element in doc.Elements("fields")) 
      { 
       var userEntry = new FieldEntryModel(); 

       //element.Value.ToList(); 
       var elementNodes = element.Nodes().ToList(); 
       var nodeBreakdown = element.Nodes().OfType<XElement>(); 

       foreach (var something in nodeBreakdown) 
       { 
        var willthiswork = something.DescendantNodes().OfType<XElement>();        
        foreach (var item in willthiswork) { 
         if (item.Value != null) 
          { 
           if (item.Value.ToString().Contains("Forename")) 
            //Console.WriteLine(item..ToString()); 
           //userEntry.Forename = item.Value.ToString(); 
          } 
        }       
      } 
    } 

Я начал путать между преобразованиями имен и типами объектов, чтобы получить данные.

ОБРАЗЦА XML:

<fields> 
    <field> 
     <label> 
     Name 
     <label> 
     <value> 
     Test 
     </value> 
    </field> 
    <field> 
     <label> 
     job 
     <label> 
     <value> 
     developer 
     </value> 
    </field> 
    <field> 
     <label> 
     address 
     <label> 
     <value> 
     1 Test 
     </value> 
    </field> 
    <field> 
     <label> 
     Name 
     <label> 
     <value> 
     Test 
     </value> 
    </field> 
</fields> 

Я бы тогда хранить эти данные в моей модели начального поля, так что:

public class FieldEntryModel 
{ 
    public string Name {get;set;} 
    public string Job {get;set;} 
    public string Address{get;set;} 
} 
+0

Просьба показать образец XML и, если возможно, результат, который вы хотите увидеть после обработки этого образца. –

+0

OK я поставлю его вверх – jsg

+0

«XElement.Value» - это строка. Вам не нужно использовать '.ToString()' на нем. –

ответ

2

Я считаю, что то, как это может работать для вас. Так как у вас, похоже, есть дубликаты ярлыков в ваших полях (например, «<». > Имя </label > «появляется дважды), здесь я использовал FirstOrDefault. Вы должны исследовать, почему существуют дубликаты и обрабатываются надлежащим образом. Если бы не было дубликатов, то лучшим выбором был бы SingleOrDefault.

var fieldElements = doc.Elements("fields").Elements("field"); 
var nameElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "Name"); 
var jobElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "job"); 
var addressElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "address"); 
var model = new FieldEntryModel 
      { 
       Name = nameElement?.Element("value")?.Value, 
       Job = jobElement?.Element("value")?.Value, 
       Address = addressElement?.Element("value")?.Value, 
      }; 

Обратите внимание, что я использовал null-conditional operator из C# 6 (Visual Studio 2015+) в этом.

+0

Это сработало до тех пор, пока оно не ударило по имени с ошибкой исключения «system.invalidOperationException» произошло в System.Core.Dll – jsg

+0

Мне пришлось немного подправить ответ. Что там теперь должно работать. –

+0

Простая ошибка – jsg