Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
253 views
in Technique[技术] by (71.8m points)

c# - Xml Parsing with Dictionary<string, List<MyObject>>

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...