Загрузка дублированных атрибутов XML с использованием XDocument - PullRequest
0 голосов
/ 22 декабря 2011

Мне нужна помощь при загрузке XML с использованием XDocument. Xml содержит данные для HierarchicalDataTemplate в WPF, поэтому каждый элемент имеет одинаковые атрибуты.

У меня возникла проблема новичка с обработкой дублирующихся атрибутов Name, image и fileLoc.

Я пытался заставить работать что-то вроде приведенного ниже кода, но, как вы видите, дублирующиеся атрибуты работать не будут.

public static List<MenuItem> Load(string MyMenuFile)
{       
    var mymenu = XDocument.Load(MyMenuFile).Root.Elements("Menu").Select(
            x => new MenuItem(
            (string)x.Attribute("id"),
                (string)x.Attribute("name"),
                (string)x.Attribute("image"),
                (string)x.Attribute("fileLoc"),
                (string)x.Element("itemlist"),
        (string)x.Attribute("name"),
                (string)x.Attribute("image"),
                (string)x.Attribute("fileLoc"),
                (string)x.Element("item"),
                (string)x.Attribute("name"),
                (string)x.Attribute("image"),
                (string)x.Attribute("fileLoc")));

    return stationfiles.ToList();
}

Вот XML:

<Menus>
    <Menu id="1"  Name="Level1" image="C:\lvl1.jpg" fileLoc="C:\lvl1.xml">
    </Menu>
    <Menu id="2"  Name="Level2" image="C:\lvl2.jpg" >
        <itemlist Name="Level2" image="C:\lvl2.jpg" fileLoc="C:\lvl2.xml">
        </itemlist>
        <itemlist Name="Level3" image="C:\lvl3.jpg">
            <item Name="First" image="C:\first.jpg" fileLoc="C:\first.xml"></item>
            <item Name="Second" image="C:\second.jpg" fileLoc="C:\second.xml"></item>
            <item Name="Third" image="C:\third.jpg" fileLoc="C:\third.xml"></item>
        </itemlist>
    </Menu>
</Menus>

Как видите, разные элементы, но дубликаты атрибутов. Должен ли я иметь 3 отдельных класса, но как бы я объединил их для нагрузки XDocument? Любая помощь будет великолепна.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Вы не занимаетесь иерархией в своей обработке.

Я настроил ваш xml, но вот пример того, как вы должны его обрабатывать:

string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Menus> 
    <Menu id=""1""  Name=""Level1 - Alpha"" image=""C:\lvl1.jpg"" fileLoc=""C:\lvl1.xml""/> 
    <Menu id=""2""  Name=""Level1 - Beta"" image=""C:\lvl2.jpg"" fileLoc=""C:\lvl1.xml"" > 
        <itemlist Name=""Level2-Gamma"" image=""C:\lvl2.jpg"" fileLoc=""C:\lvl2.xml""/>  
        <itemlist Name=""Level3-Zeta"" image=""C:\lvl3.jpg"" fileLoc=""C:\lvl1.xml""> 
            <item Name=""First"" image=""C:\first.jpg"" fileLoc=""C:\first.xml""></item> 
            <item Name=""Second"" image=""C:\second.jpg"" fileLoc=""C:\second.xml""></item> 
            <item Name=""Third"" image=""C:\third.jpg"" fileLoc=""C:\third.xml""></item> 
        </itemlist> 
    </Menu> 
</Menus>";

var xd = XDocument.Parse(xml);

var result = 

xd.Descendants("Menu")
  .Select (l1 => new 
  {
   Name     = l1.Attribute("Name").Value, 
   Image    = l1.Attribute("image").Value, 
   File     = l1.Attribute("fileLoc"),
   Children = l1.Descendants("itemlist")
                  .Select (l2 => new {
                                Name     = l2.Attribute("Name").Value, 
                                Image    = l2.Attribute("image").Value, 
                                File     = l2.Attribute("fileLoc"),
                                Children = l2.Descendants("item")
                                                .Select (l3 => new {
                                                        Name  = l3.Attribute("Name").Value, 
                                                        Image = l3.Attribute("image").Value, 
                                                        File  = l3.Attribute("fileLoc")
                                                                    })
                  })

});

Console.WriteLine (result );

Вот результат, полученный из linqpad:

enter image description here

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

HTH

0 голосов
/ 22 декабря 2011

Предполагается, что это элементы и атрибуты непосредственно из MenuItem. Я подозреваю, что вам нужно прочитать атрибуты элементов itemslist и items. Не уверен, как это сделать с помощью одного цикла. Вам нужно перебрать элементы, а затем зациклить атрибут, чтобы элемент THAT (не родительский элемент).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...