解析内标签与它的价值 [英] Parsing inner tag with its value

查看:152
本文介绍了解析内标签与它的价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这个格式的plist:



<预类=郎咸平的XML prettyprint-覆盖> <的plist版本=1.0 >
<阵列GT;
<&字典GT;
<密钥GT;标题< /键>
<串GT;&章LT; /串>
<密钥GT;项目< /键>
<阵列GT;
<&字典GT;
<密钥GT;标题< /键>
<串GT;&XYZ LT; /串>

< /字典>
<&字典GT;
<密钥GT;标题< /键>
<串GT; ABC< /串>

< /字典>
< /阵列>
< /字典>
<&字典GT;
<密钥GT;标题< /键>
<串GT; ChaptersONE< /串>
<密钥GT;项目< /键>
<阵列GT;
<&字典GT;
<密钥GT;标题< /键>
<串GT;航空自卫队< /串>

< /字典>
< /阵列>
< /字典>
< /阵列>



我有一个字符串和列表一类章类:



我需要这样的:
章节包含如XYZ和ABC副主题列表等等...
ChaptersONE包含像ASDF等副主题的列表...



现在我已经尝试过这样的:

 的XDocument文档= XDocument.Load (文件名); // plist文件名
的XElement的plist = doc.Element(的plist);
的XElement数组= plist.Element(阵列);

章章= NULL;
字符串的keyValue =的String.Empty;

chapters.listOfItems =新的List<&章GT;();

使用(读者的XmlReader = array.CreateReader())
{
reader.MoveToContent();
,而(reader.Read())
{
如果(reader.NodeType == XmlNodeType.Element)
{
如果(reader.Name ==字典)
{
章=新的篇章();
listOfItems.Add(章);
}
,否则如果(reader.Name ==密钥)
{
如果
{
断点(reader.Read()!);
}
,否则如果(reader.NodeType == || XmlNodeType.Text == reader.NodeType XmlNodeType.CDATA)
{
的keyValue = reader.Value;
}
}
,否则如果(reader.Name ==字符串)
{
如果(!reader.Read())
$ { b $ b断点;
}
,否则如果(highwayCode = NULL&放大器;!&安培; reader.NodeType == || XmlNodeType.Text == reader.NodeType XmlNodeType.CDATA)
{
开关(的keyValue)
{
案标题:
chapters.Header = reader.Value;
中断;
案的相关文件:
中断;
默认:
中断;
}
}
}
}
}
}

但我所有的主标题(如章和ChaptersOne头),也是副标题只是分配给只有字符串,我究竟做错了什么?



如何解决达致这?



修改
章节应该包含如XYZ和ABC和副主题列表等等...
ChaptersONE应该包含像ASDF副主题列表等等...


解决方案

是的,还有一个更简单的方法:

 的XDocument DOC = XDocument.Load(input.xml中); // plist文件名

无功章=(从doc.Root.Element D(阵列)。元素(字典)
选择新章
{
标题=(字符串)d.Element(字符串),
字幕= d.Element(阵)
.Elements(字典)
.Elements(字符串)
。选择(S => (字符串)S)
.ToList()
})了ToList()。

您没有显示你的班,所以我认为它看起来像:

 类章
{
公共字符串名称{搞定;组; }
公开名单<串GT;字幕{搞定;组; }
}


I have a plist in this format:

<plist version="1.0">
<array>
    <dict>
        <key>Title</key>
        <string>Chapters</string>
        <key>Items</key>
        <array>
            <dict>
                <key>Title</key>
                <string>XYZ</string>

            </dict>
            <dict>
                <key>Title</key>
                <string>ABC</string>

            </dict>
              </array>
    </dict>
    <dict>
        <key>Title</key>
        <string>ChaptersONE</string>
        <key>Items</key>
        <array>
            <dict>
                <key>Title</key>
                <string>ASDF</string>

            </dict>
               </array>
    </dict>
</array>

I have a Class Chapters class with String and List :

i need it like this: Chapters contains list of subtopics like XYZ and ABC and so on... ChaptersONE contains list of subtopics like ASDF and so on...

Now i have tried it like this:

XDocument doc = XDocument.Load(FileName);// plist file name
XElement plist = doc.Element("plist");
XElement array = plist.Element("array");

Chapters chapters = null;
String keyValue = String.Empty;

chapters.listOfItems = new List<Chapters>();

using (XmlReader reader = array.CreateReader())
{
    reader.MoveToContent();
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element)
        {
            if (reader.Name == "dict")
            {
                chapters = new Chapters();
                listOfItems.Add(chapters);
            }
            else if (reader.Name == "key")
            {
                if (!reader.Read())
                {
                    break;
                }
                else if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA)
                {
                    keyValue = reader.Value;
                }
            }
            else if (reader.Name == "string")
            {
                if (!reader.Read())
                {
                    break;
                }
                else if (highwayCode != null && reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA)
                {
                    switch (keyValue)
                    {
                        case "Title":
                            chapters.Header = reader.Value;
                            break;
                        case "Items":
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
}

But i all the Main title (Headers like Chapters and ChaptersOne) and also the subtopics are just assigning to only the string, what am i doing wrong here ?

How to fix acheive this ?

EDIT Chapters should contains list of subtopics like XYZ and ABC and so on... ChaptersONE should contains list of subtopics like ASDF and so on...

解决方案

Yes, there is an easier way:

XDocument doc = XDocument.Load("input.xml");// plist file name

var chapters = (from d in doc.Root.Element("array").Elements("dict")
                select new Chapter
                {
                    Title = (string)d.Element("string"),
                    SubTitles = d.Element("array")
                                 .Elements("dict")
                                 .Elements("string")
                                 .Select(s => (string)s)
                                 .ToList()
                }).ToList();

You didn't show your classes, so I assumed it looks like that:

class Chapter
{
    public string Title { get; set; }
    public List<string> SubTitles { get; set; }
}

这篇关于解析内标签与它的价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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