我正在尝试使用此代码解析文件。我无法做到。任何帮助都会很棒 我试图从文本框中传递文件名,它只是做得很好,但解析存在于循环中。
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>
答案 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 ;
}