2015-02-06 106 views
0

我有以下XML结构:XMLReader不能读取文件

<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属性,我尝试了不同的方式来读取数据,但不管怎样,它总是跳过带有空标记的文件。现在一个星期我将尝试每一个教程中,我能找到的了,可是不应对已工作

回答

0

你的代码,跳过你的text元素:

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

删除,并检查自动关门元素XmlReader.IsEmptyElement

+0

你看到的那段代码就是“最后的版本”。在它之前,我已经试过没有reader.Skip属性,并且如果它是空的,我检查了文本元素,但是这也不起作用 – Ange1 2015-02-06 16:18:49