解析器退出循环

时间:2014-03-25 22:14:49

标签: c# xml

我正在尝试使用此代码解析文件。我无法做到。任何帮助都会很棒 我试图从文本框中传递文件名,它只是做得很好,但解析存在于循环中。

public void ParseXML(String FileName)
{

  XmlTextReader reader = new XmlTextReader(FileName);
  XmlNodeType type;
  while (reader.Read())
  {
    type = reader.NodeType;
    if (type == XmlNodeType.Element)
    {
      if (reader.Name == "PIChart")
      {
        if (reader.Name == "NumberofSectors")
        {
          m_SectorValue = Convert.ToInt32(reader.Value);
          Sectors = m_SectorValue;
        }
        if (reader.Name == "AngleofSector")
        {
          if (reader.Name == "StartAngle")
          {
            m_StartValue = Convert.ToInt32(reader.Value);
            StartValue.Enqueue(m_StartValue);
          }
          if (reader.Name == "EndAngle")
          {
            m_EndAngle = Convert.ToInt32(reader.Value);
            EndAngle.Enqueue(m_EndAngle);
          }
        }
        if (reader.Name == "ColorofSectorRegion")
        {
          if (reader.Name == "Region")
          {
            m_Region = Convert.ToInt32(reader.Value);
            Region.Enqueue(m_Region);
          }
          if (reader.Name == "Color")
          {
            m_Color = reader.Value;
            color.Enqueue(m_Color);
          }
        }
      }
    }
  }
  reader.Close();
}

我试图解析的文件

<PIChart>
  <NumberofSectors>5</NumberofSectors>
  <AngleofSector>
    <StartAngle>0</StartAngle>
    <EndAngle>72</EndAngle>
    <StartAngle>72</StartAngle>
    <EndAngle>144</EndAngle>
  </AngleofSector>
  <ColorofSectorRegion>
    <Region>0</Region>
    <Color>Green</Color>
  </ColorofSectorRegion>
</PIChart>

2 个答案:

答案 0 :(得分:5)

你的部分问题是:

            if (reader.Name == "PIChart")
            {
                if (reader.Name == "NumberofSectors")
                {
                    m_SectorValue = Convert.ToInt32(reader.Value);
                    Sectors = m_SectorValue;
                }
                if (reader.Name == "AngleofSector")
                {
                // etc.

您的第一个条件期望reader.Name等于“PIChart”。然后检查它是否等于“NumberofSectors”或“AngleOfSector”等。这是永远不会起作用的,因为reader.Name不能同时保存两个单独的值。

您是否可能正在寻找名为“NumberOfSectors”的属性?您需要查看GetAttribute方法。

如果您编辑问题并显示至少部分您正在尝试阅读的XML文件,那将会有所帮助。

发表评论后

XmlDocument或使用序列化程序阅读它会好得多。但是如果你真的想读这个,你需要使用XmlReader.ReadSubTree来解析那些单独的元素。类似的东西:

if (reader.Name == "PIChart")
{
    ParsePIChart(reader.ReadSubTree());
}

您的ParsePIChart方法将读取该子树并解析子元素。

答案 1 :(得分:1)

为什么这么难? .Net / CLR提供您需要的所有工具。 Xml Serialization是你的朋友。只需使用合适的属性标记您的数据结构:

[XmlRoot("PIChart")]
public class PieChart
{
    [XmlElement("NumberofSectors")]     public int         NumberOfSectors     { get ; set ; }
    [XmlElement("AngleofSector")]       public SectorAngle AngleOfSector       { get ; set ; }
    [XmlElement("ColorofSectorRegion")] public SectorColor ColorOfSectorRegion { get ; set ; }
}
public class SectorAngle
{
    [XmlElement] public int[] StartAngle { get ; set ; }
    [XmlElement] public int[] EndAngle   { get ; set ; }
}
public class SectorColor
{
    [XmlElement] public int    Region { get ; set ; }
    [XmlElement] public string Color  { get ; set ; }
}

您可以像这样轻松地反序列化XML:

string xml = @"
  <PIChart>
    <NumberofSectors>5</NumberofSectors>
    <AngleofSector>
      <StartAngle>0</StartAngle>
      <EndAngle>72</EndAngle>
      <StartAngle>72</StartAngle>
      <EndAngle>144</EndAngle>
    </AngleofSector>
    <ColorofSectorRegion>
      <Region>0</Region>
      <Color>Green</Color>
    </ColorofSectorRegion>
  </PIChart>
" ;

PieChart chart = Rehydrate<PieChart>(xml) ;

...

public static T Rehydrate<T>( string xml )
{
  T instance ;
  using ( StringReader reader = new StringReader( xml ) )
  {
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    instance = (T) serializer.Deserialize(reader) ;
  }
  return instance ;
}