【问题标题】:XmlReader does not read file if it contains a self closing tag如果文件包含自结束标记,则 XmlReader 不会读取文件
【发布时间】:2017-11-08 18:03:16
【问题描述】:

我有以下 Xml 结构:

<event id="0" start_time="2014-05-21 10:00:00" duration="86340">

  <short_event_descriptor lang="alb" name="Programet e Kanalit A1">Programe/Emisione</short_event_descriptor>

  <extended_event_descriptor lang="alb">

    <text>Programet dhe Emisionet e perditshme te kanalit A1</text>

  </extended_event_descriptor>

</event>

<event id="1" start_time="2014-05-22 10:00:00" duration="86340">

  <short_event_descriptor lang="alb" name="Programs of Channel A1">Programs/TalkShows</short_event_descriptor>

  <extended_event_descriptor lang="alb">

    <text />

  </extended_event_descriptor>

</event>

我正在尝试的代码如下:

try
            {

                while (reader.Read())
                {

                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element: // The node is an element.
                                if (reader.Name == "channel")
                                {
                                    while (reader.MoveToNextAttribute())
                                    {
                                        if (reader.Name == "name")
                                        {
                                           // epg = new epg2();
                                            epg.channelname = reader.Value;
                                            epg.number = Convert.ToInt32(channelNames[i][1]);
                                            xmlfile.Add(epg);
                                        }
                                    }
                                }
                                if (reader.Name == "event")
                                {
                                    while (reader.MoveToNextAttribute())
                                    {
                                        if (reader.Name == "start_time")
                                        {
                                           // Ev = new Event();
                                            Ev.starttime = Convert.ToDateTime(reader.Value);
                                        }
                                        else if (reader.Name == "duration")
                                        {
                                            Ev.duration = Convert.ToInt32(reader.Value);
                                        }
                                        else if (reader.Name == "name")
                                        {
                                            Ev.duration = Convert.ToInt32(reader.Value);
                                        }
                                    }
                                }
                                if (reader.Name == "short_event_descriptor")
                                {
                                    while (reader.MoveToNextAttribute())
                                    {
                                        if (reader.Name == "name")
                                        {
                                            Ev.name = reader.Value;
                                        }
                                    }
                                }

                                break;
                            case XmlNodeType.Text: //Display the text in each element.
                                if (shenjuar > 0)
                                {
                                    try
                                    {
                                        Ev.shortDescription = reader.Value.Replace("\r\n", "").Replace("\r", "").Replace("\n", "").Replace("Sub. Ang", "").Replace("Sub. Alb", "").Replace('\"', '\''); ;
                                    }
                                    catch
                                    {
                                        Ev.shortDescription = reader.Value;
                                    }
                                    shenjuar *= -1;
                                }
                                else if (shenjuar < 0)
                                {
                                    try
                                    {
                                        Ev.longDescription = reader.Value.Replace("\r\n", "").Replace("\r", "").Replace("\n", "").Replace("Sub. Ang", "").Replace("Sub. Alb", "").Replace('\"', '\''); ;
                                    }
                                    catch
                                    {
                                        Ev.longDescription = reader.Value;
                                    }
                                    shenjuar *= -1;
                                    epg.EventNumber.Add(Ev);
                                }
                                else reader.Skip();
                                break;
                            case XmlNodeType.EndElement: //Display the end of the element
                                reader.Skip();
                                break;

                        }
                    }
                    xmlfile.Add(epg);
                }

            catch (FileNotFoundException fnfe)
            {
                TextBox1.Text = "Error. Can not find " + CName + ".xml file";
                //return;
            }
            catch (Exception exc)
            {
                TextBox1.Text = "Unknown Error: \r\nError on " + CName + ".xml file \r\n Error Description:" + exc.Message;
                //return;
            }
        }

关键是这段代码用于 XML 文件的列表,问题是对于某些文件,标签是自动关闭的,在这种情况下,阅读器根本不会阅读它们。由于 XML 文件是作为标准带到公司的,并且每天都在更改其内容,因此我无法更改其结构。我尝试使用 IsEmptyElement 属性,我尝试了不同的方式来读取数据,但无论如何,它总是会跳过带有空标签的文件。已经一个星期了,我正在尝试我能找到的每一个教程,但没有任何处理工作

【问题讨论】:

    标签: c# asp.net-3.5 xmlreader


    【解决方案1】:

    您的代码跳过了您的 text 元素:

    if (reader.IsStartElement("text"))
        reader.Skip();
    

    删除它并使用XmlReader.IsEmptyElement检查自动关闭元素。

    【讨论】:

    • 您看到的那段代码是“最新版本”。在此之前,我尝试不使用 reader.Skip 属性,并且我检查了文本元素是否为空,但这也不起作用
    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多