Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析带值的内部标记_C#_Xml_Windows Phone 8_Xml Parsing_Linq To Xml - Fatal编程技术网

C# 解析带值的内部标记

C# 解析带值的内部标记,c#,xml,windows-phone-8,xml-parsing,linq-to-xml,C#,Xml,Windows Phone 8,Xml Parsing,Linq To Xml,我有一个以下格式的plist: 标题 章 项目 标题 XYZ 标题 基础知识 标题 第三章 项目 标题 ASDF 我有一个带有字符串和列表的类: 我需要这样: 各章包含了诸如XYZ和ABC等子主题的列表。。。 第四章包含了一些小主题,如ASDF等等 现在我已经这样试过了: XDocument doc = XDocument.Load(FileName);// plist file name XElement plist = doc.Element("plist"); XElement arr

我有一个以下格式的plist:


标题
章
项目
标题
XYZ
标题
基础知识
标题
第三章
项目
标题
ASDF
我有一个带有字符串和列表的类:

我需要这样: 各章包含了诸如XYZ和ABC等子主题的列表。。。 第四章包含了一些小主题,如ASDF等等

现在我已经这样试过了:

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;
                    }
                }
            }
        }
    }
}
XDocument doc=XDocument.Load(文件名);//plist文件名
XElement plist=文档元素(“plist”);
XElement数组=plist.Element(“数组”);
章=空;
String keyValue=String.Empty;
chapters.listOfItems=新列表();
使用(XmlReader=array.CreateReader())
{
reader.MoveToContent();
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
如果(reader.Name==“dict”)
{
章节=新章节();
项目列表。添加(章节);
}
else if(reader.Name==“key”)
{
如果(!reader.Read())
{
打破
}
else if(reader.NodeType==XmlNodeType.Text | | reader.NodeType==XmlNodeType.CDATA)
{
keyValue=reader.Value;
}
}
else if(reader.Name==“string”)
{
如果(!reader.Read())
{
打破
}
else if(highwayCode!=null&&reader.NodeType==XmlNodeType.Text | | reader.NodeType==XmlNodeType.CDATA)
{
开关(键值)
{
案例“标题”:
chapters.Header=reader.Value;
打破
案例“项目”:
打破
违约:
打破
}
}
}
}
}
}
但是我知道所有的主标题(如章节标题)和副标题都只分配给字符串,我在这里做错了什么

如何解决这个问题

编辑 章节应该包含像XYZ和ABC等子主题的列表。。。
第1章应包含ASDF等子主题的列表…

是的,有一种更简单的方法:

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();
你没有展示你的课程,所以我假设它看起来是这样的:

class Chapter
{
    public string Title { get; set; }
    public List<string> SubTitles { get; set; }
}
课程章节
{
公共字符串标题{get;set;}
公共列表字幕{get;set;}
}

您的问题不清楚。你的课看起来怎么样?预期输出是什么样子的?什么是
highwayCode
?为什么需要使用基于
XmlReader
的代码而不是基本的Linq to Xml?请查看我的编辑人员如果还有其他简单的解析方法也可以,但我希望得到我的editOk中提到的输出,我会尝试一下,并告诉你我这里有一个问题,比如,标题也是一个项目列表,而字幕也是一个列表,所以如何检查它是否正确,我的意思是打印它的值,?很抱歉延迟回复,就像我需要打印像章->ABC,XYZ然后下一章->ASDF这样的值,我如何打印这个?你可以使用
字符串。Join
方法。你能告诉我如何打印吗?因为我刚刚开始学习c#