LINQ到XML嵌套字典和数组 [英] Linq to XML with nested Dictionary and Array

查看:113
本文介绍了LINQ到XML嵌套字典和数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有一个这样的文件:



<$ P $

我在Windows Phone 8应用程序的工作p> <阵列GT;
<&字典GT;
<密钥GT;&子专题LT; /键>
<阵列GT;
<&字典GT;
<密钥GT; ID< /键>
<阵列GT;
<串GT;&CD1 LT; /串>
<串GT; CD2< /串>
<串GT; CD3< /串>
<串GT;的CD4 /串>
< /阵列>
<密钥GT;标题< /键>
<串GT;其他< /串>
<密钥GT;&说明LT; /键>
<串GT;这仅仅是一个文字< /串>
<密钥GT; HasItems< /键>
<真/>
< /字典>
<&字典GT;
<密钥GT; ID< /键>
<阵列GT;
<串GT; DDC1< /串>
<串GT; DDC2< /串>
<串GT;&DDC3 LT; /串>
<串GT; DDC4< /串>
<串GT; DDC5< /串>
< /阵列>
<密钥GT;标题< /键>
<串GT;其他的One< /串>
<密钥GT;&说明LT; /键>
<串GT;这仅仅是一个文字< /串>
<密钥GT; HasItems< /键>
<真/>
< /字典>
< /阵列>
<密钥GT;&MAINTITLE LT; /键>
<串GT;数据< /串>
< /字典>
<&字典GT;
<密钥GT;&子专题LT; /键>
<阵列GT;
<&字典GT;
<密钥GT; ID< /键>
<阵列GT;
<串GT;&SSD1 LT; /串>
<串GT; SS2< /串>
<串GT;&SS3 LT; /串>
<串GT; SS4< /串>
< /阵列>
<密钥GT;标题< /键>
<串GT;妖精< /串>
<密钥GT;&说明LT; /键>
<串GT;这仅仅是一个文字< /串>
<密钥GT; HasItems< /键>
<真/>
< /字典>
<&字典GT;
<密钥GT; ID< /键>
<阵列GT;
<串GT; ADC1< /串>
<串GT;&ADC2 LT; /串>
<串GT;&ADC3 LT; /串>
<串GT;&ADC4 LT; /串>
<串GT; DDC5< /串>
< /阵列>
<密钥GT;标题< /键>
<串GT;&轨道LT; /串>
<密钥GT;&说明LT; /键>
<串GT;这仅仅是一个文字< /串>
<密钥GT; HasItems< /键>
<真/>
< /字典>
< /阵列>
<密钥GT;&MAINTITLE LT; /键>
<串GT;数据二< /串>
< /字典>
< /阵列>



如何分析呢?



其像这样的:

  MAINTITLE 

--SubTitle

--- ID

---说明

---布尔值
MAINTITLE

--SubTitle

--- ID

---说明

---布尔值

$ b $ ; b

基本上是一个具有价值的关键和数组列表词典列表



我已经试过这样的,但它不是完成:

 列表<&MyObject的GT;主题=(从plist中在doc.Root.Element(阵列)。元素(字典)
选择新的MyObject的
{
MAINTITLE =(字符串)plist.Element(字符串),
ListOfSubTitles = plist.Element(阵)
.Elements(字典)
.Elements(字符串)
。选择(S = GT; (字符串)S)
.ToList(),
ListOfIDs = plist.Element(阵)
.Elements(字典)
.Elements(阵)
.Elements(字符串)
。选择(S = GT; (字符串)S)
.ToList()
})了ToList()。


解决方案

好吧,这里是一个小类,它可以分析你XML:

 公共类解析器
{
公开名单<字典<字符串对象>>解析(根的XElement)
{
VAR的结果=新的List<&字典LT;字符串对象>>();

的foreach(在root.Elements变种E())
{
如果(e.Name ==字典)
{
的结果。添加(ParseDict(e)条);
}
}

返回结果;
}

私人字典<字符串对象> ParseDict(的XElement元素)
{
变种字典=新词典<字符串对象>();

的foreach(在element.Elements VAR子元素())
{
如果(subelement.Name ==密钥)
{
字典。添加(subelement.Value,ParseValue(subelement.ElementsAfterSelf()一()));
}
}

返回字典;
}

私有对象ParseValue(的XElement valueElement)
{
如果(valueElement.Name ==字符串)
{
返回valueElement.Value;
}

如果(valueElement.Name ==阵)
{
返回新的List<对象>(valueElement.Elements()选择(E = > ParseValue(E)));
}

如果(valueElement.Name ==字典)
{
返回ParseDict(valueElement);
} $ B如果(valueElement.Name ==真)
{
返回真
$ B;
} $ B如果(valueElement.Name ==假)
{
返回假
$ B;
}

返回NULL;
}
}



它用于这样的:

  VAR分析器=新分析器(); 
VAR DOC = XDocument.Load(小于路径XML文件>);

VAR的结果= parser.Parse(doc.Root);



解析器是非常粗略,使有关XML的假设。正如前面的评论中指出,这是不使用这样的XML,其中的元素位置具有重要意义的最佳途径。另外在分析器中使用对象是不是一个好的解决方案,但是解析器得到了很多,如果你想避免这种更先进的。


I am Working on Windows Phone 8 application:

I have a document like this :

<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

  ---ID

  ---Desc

  ---Boolean Value
 MainTitle 

   --SubTitle

  ---ID

  ---Desc

  ---Boolean Value

Basically a List of Dictionary with Key and Array list of values.

I have tried like this but its not complete:

List<MyObject> topics = (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(),
                                      ListOfIDs = plist.Element("array")
                                                    .Elements("dict")
                                                    .Elements("array")
                                                    .Elements("string")
                                                    .Select(s => (string)s)
                                                    .ToList()
                                  }).ToList();

解决方案

Ok, here is a little class that can parse your xml:

public class Parser
{
    public List<Dictionary<string, object>> Parse(XElement root)
    {
        var result = new List<Dictionary<string, object>>();

        foreach (var e in root.Elements())
        {
            if (e.Name == "dict")
            {
                result.Add(ParseDict(e));
            }
        }

        return result;
    }

    private Dictionary<string, object> ParseDict(XElement element)
    {
        var dict = new Dictionary<string, object>();

        foreach (var subelement in element.Elements())
        {
            if (subelement.Name == "key")
            {
                dict.Add(subelement.Value, ParseValue(subelement.ElementsAfterSelf().First()));        
            }
        }

        return dict;
    }

    private object ParseValue(XElement valueElement)
    {
        if (valueElement.Name == "string")
        {
            return valueElement.Value;
        }

        if (valueElement.Name == "array")
        {
            return new List<object>(valueElement.Elements().Select(e => ParseValue(e)));
        }

        if (valueElement.Name == "dict")
        {
            return ParseDict(valueElement);
        }

        if (valueElement.Name == "true")
        {
            return true;
        }

        if (valueElement.Name == "false")
        {
            return false;
        }

        return null;
    }
}

It is used like this:

        var parser = new Parser();
        var doc = XDocument.Load(<path to xml file>);

        var result = parser.Parse(doc.Root);

The parser is very crude and makes assumptions about the xml. And as pointed out in earlier comments, it is not the best way to use xml like this, where position of elements has significance. Also the use of "object" in the parser isn't a good solution, but the parser gets a lot more advanced if you want to avoid that.

这篇关于LINQ到XML嵌套字典和数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆