Xml Parsing with Dictionary<string, List<MyObject>>

吃可爱长大的小学妹 提交于 2019-12-13 08:59:10

问题


I am working on Windows Phone 8 app development.

i have a xml like the below:

<array>
    <dict>
        <key>SubTopics</key>
        <array>
            <dict>
                <key>ID</key>
                <array>
                    <string>CD1</string>
                    <string>CD2</string>
                    <string>CD3</string>
                    <string>CD4</string>    
                </array>
                <key>Title</key>
                <string>Miscellaneous</string>
                <key>Desc</key>
                <string> this is just a text</string>
                <key>HasItems</key>
                <true/>
            </dict>
            <dict>
                <key>ID</key>
                <array>
                    <string>DDC1</string>
                    <string>DDC2</string>
                    <string>DDC3</string>
                    <string>DDC4</string>
                    <string>DDC5</string>
                </array>
                <key>Title</key>
                <string>Miscellaneous One</string>
                <key>Desc</key>
                <string> this is just a text</string>
                <key>HasItems</key>
                <true/>
            </dict>
      </array>
      <key>MainTitle</key>
      <string>Data</string>
    </dict>
    <dict>
        <key>SubTopics</key>
        <array>
            <dict>
                <key>ID</key>
                <array>
                    <string>SSD1</string>
                    <string>SS2</string>
                    <string>SS3</string>
                    <string>SS4</string>    
                </array>
                <key>Title</key>
                <string>Goblins</string>
                <key>Desc</key>
                <string> this is just a text</string>
                <key>HasItems</key>
                <true/>
            </dict>
            <dict>
                <key>ID</key>
                <array>
                    <string>ADC1</string>
                    <string>ADC2</string>
                    <string>ADC3</string>
                    <string>ADC4</string>
                    <string>DDC5</string>
                </array>
                <key>Title</key>
                <string>Tracks</string>
                <key>Desc</key>
                <string> this is just a text</string>
                <key>HasItems</key>
                <true/>
            </dict>
      </array>
      <key>MainTitle</key>
      <string>Data Two</string>
    </dict>
</array>

How to parse this ?

Its like this :

MainTitle 

   --SubTitle // list of title 

  ---ID

  ---Desc

  ---Boolean Value
 MainTitle 

   --SubTitle //list of values

  ---ID

  ---Desc

  ---Boolean Value

Now in 1st screen i am displaying all the Main Titles

Now on click of Main tile in 1st screen i need all the values of that main title.

So how can i store these a Dictionary<string, List<MyObject>> ?

EDIT

I have tried this:

var dict = (from plist in doc.Root.Element("array").Elements("dict")
                          select new MyObject
                          {
                              MainTitle = (string)plist.Element("string"),
                              ListOfSubTitles = plist.Element("array")
                                                   .Elements("dict")
                                                   .Elements("string")
                                                   .Select(s => (string)s)
                                                   .ToList(),
                          })
                         .ToDictionary(a => a.MainTitle, a => a.ListOfSubTitles);

But here its also storing the Desc tag values also in the ListOfSubTitles


回答1:


I suggest to use helper methods. First one is to create dictionary of values from your strange xml data format (it uses key element value as dictionary entry key, and next node as dictionary entry value):

static Dictionary<string, XElement> GetValues(XElement dict)
{
    return dict.Elements("key")
               .ToDictionary(k => (string)k, k => (XElement)k.NextNode);
}

Second one is parsing MyObject:

static MyObject ParseMyObject(XElement dict)
{
    var values = GetValues(dict);

    return new MyObject
    {
        MainTitle = (string)values["Title"],
        ListOfSubTitles = values["ID"].Elements().Select(s => (string)s).ToList()
    };
}

All parsing will look like:

XDocument xdoc = XDocument.Load(path_to_xml);
var result = 
    xdoc.Root.Elements("dict")
        .Select(GetValues)
        .ToDictionary(v => (string)v["MainTitle"],
                      v => v["SubTopics"]
                              .Elements("dict").Select(ParseMyObject).ToList());

Result of parsing:

{
  "Data": [
    {
      MainTitle: "Miscellaneous",
      ListOfSubTitles: [ "CD1", "CD2", "CD3", "CD4" ]
    },
    {
      MainTitle: "Miscellaneous One",
      ListOfSubTitles: [ "DDC1", "DDC2", "DDC3", "DDC4", "DDC5" ]
    }
  ],
  "Data Two": [
    {
      MainTitle: "Goblins",
      ListOfSubTitles: [ "SSD1", "SS2", "SS3", "SS4" ]
    },
    {
      MainTitle: "Tracks",
      ListOfSubTitles: [ "ADC1", "ADC2", "ADC3", "ADC4", "DDC5" ]
    }
  ]
}


来源:https://stackoverflow.com/questions/22156794/xml-parsing-with-dictionarystring-listmyobject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!