Xml Parsing with Dictionary>

2019-09-20 08:47发布

问题:

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" ]
    }
  ]
}