2017-02-22 93 views
1

Я новичок в LINQ и XML, но я смог разобрать основной XML-файл без проблем. Однако я попал в ситуацию, когда у меня есть дублирующие элементы внутри потомка, и мне нужна вся информация из дубликатов. Мой XML выглядитC# синтаксический анализ XML-документа с LINQ, где существует различное количество повторяющихся элементов

<?xml version="1.0" encoding="utf-8" ?> 
<Catalog> 
    <Macros> 
     <Page> 
      <HLF></HLF> 
      <ML>MCP</ML> 
      <Name>2</Name> 
      <Macro_Name>Pages\Spare_Page.emp</Macro_Name> 
     </Page> 
     <Window> 
      <HLF></HLF> 
      <ML>MCP</ML> 
      <Name>2</Name> 
      <Macro_Name>RAF\MOTOR_MACRO.ema</Macro_Name> 
      <Variant>A</Variant> 
      <PlaceHolder> 
       <ValueSet>1</ValueSet> 
      </PlaceHolder> 
      <PlaceHolder> 
       <ValueSet>2</ValueSet> 
      </PlaceHolder> 
     </Window> 
     <Window> 
      <HLF></HLF> 
      <ML>MCP</ML> 
      <Name>2</Name> 
      <Macro_Name>RAF\MOTOR_MACRO.ema</Macro_Name> 
      <Variant>A</Variant> 
      <PlaceHolder> 
       <ValueSet>1</ValueSet> 
      </PlaceHolder> 
      <PlaceHolder> 
       <ValueSet>2</ValueSet> 
      </PlaceHolder> 
      <PlaceHolder> 
       <ValueSet>3</ValueSet> 
      </PlaceHolder> 
     </Window>  
    </Macros> 
</Catalog> 

Как вы можете видеть, у меня есть 2 различных типов макросов, которые я могу получить доступ индивидуально без проблем. Проблема возникает, когда я пытаюсь выполнить итерацию через макросы окна и перейти в раздел «PlaceHolder».

var WinMacro = from w in xDoc.Descendants("Window") 
        select new 
        { 
         PG_HLF = w.Element("HLF").Value, 
         PG_ML = w.Element("ML").Value, 
         PG_Name = w.Element("Name").Value, 
         MacroName = w.Element("Macro_Name").Value, 
         MacroVariant = w.Element("Variant").Value, 
         Placeholder = w.Element("PlaceHolder"), 
        }; 

Как я могу получить доступ и сохранить все значения с каждым держателем макроса?

+0

@octavioccl С тех пор я добавил слой сложности. Я надеюсь, что вы сможете помочь. Я думал, что ответ был концом этого, но теперь кажется, что мне нужно, чтобы в XML был атрибут, который мне тоже нужно сохранить. Каждый элемент-заполнитель будет иметь также атрибут name, . Мне нужно, чтобы оба значения вместе в объекте могли ссылаться позже. Было бы целесообразно сохранить их в словаре или просто сохраните их как массив Xelements, к которому я могу обратиться позже? – Tom

+0

Через пробную версию и ошибку я ответил на свой вопрос, я изменил свой оператор select на Placeholder = w.Elements («PlaceHolder»). Выберите (e => new {Name = e.Attribute ("name"). Value, Value = e.Value}) ToList() Теперь я могу легко получить доступ к имени и значению позже. – Tom

ответ

1

Вы можете использовать Elements метод, чтобы получить все заполнители и называете Select позже, чтобы получить значение от каждого из них:

//... 
Placeholders = w.Elements("PlaceHolder").Select(e=>e.Value).ToList(), 

Если вы хотите сохранить результат в виде списка целых чисел, то вы могли бы сделайте следующее: литье

Placeholders = w.Elements("PlaceHolder").Select(e=>(int)e).ToList(), 
+0

Это был идеальный подход, он позволит мне перебирать через простой список для моей обработки. – Tom

1

Вы можете использовать LINQ:

var xmlStr = File.ReadAllText("fileName.xml"); 
    var str = XElement.Parse(xmlStr); 
    var result = str.Elements("PlaceHolder").Select(x => x.Value).ToList();