在解析XML时处理速记结束标记

时间:2012-08-06 19:26:04

标签: c# xml xml-parsing

为了简单起见,我将大大降低项目的复杂性,并给出一个简单但同样准确的例子,说明我正在努力解决的问题。我有两个XML文件,我们称之为Read.xmlWrite.xml。目标是让我的项目读取 Read.xml 的内容,将XML解析为类,然后将其重建为 Write.xml

XML生成 Read.xml 的方式是,当元素没有值时,它使用简写结束标记(<ElementName />),并且当它具有值时它使用了手写的结束标记(<ElementName>Element Value</ElementName>)。我无法控制 Read.xml 中的XML生成。

以下代码适用于解析XML,只要它使用longhand结束标记即可。但是,如果下面说ReportId是使用速记结束标记,那么现在的代码将读取下一行(对于长手程结束标记将是XML元素的值),但下一行line是一个空格元素,其值为“\ n”。然后,这会在 Write.xml 中为XML添加一个新行,这使XML格式变得奇怪。这是我用来从 Read.xml

读取和解析XML的代码
        while(xmlReader.Read())
        {
            switch(xmlReader.NodeType)
            {
                case XmlNodeType.Element:
                    if(xmlReader.Name.Equals("ReportSummary") && xmlReader.IsStartElement())
                    {
                        currentReport = new Entities.Report();
                    }
                    else if(xmlReader.Name.Equals("ReportName"))
                    {
                        xmlReader.Read();
                        currentReport.ReportName = xmlReader.Value;
                    }
                    else if(xmlReader.Name.Equals("ReportId"))
                    {
                        xmlReader.Read();
                        currentReport.ReportId = xmlReader.Value;
                    }
                    break;
                case XmlNodeType.EndElement: //Reached the end of the element.
                    if(xmlReader.Name.Equals("ReportSummary"))
                    {
                        if(currentReport!= null)
                        {
                            reportList.Add(currentReport);
                            currentReport = null;
                        }
                    }
                    break;
                default:
                    break;
            }
        }

我的问题是,是否有一种正确的方法来处理速记结束标签与长手关闭标签。或者,有没有更好的方法来解析XML文件?

提前感谢所有提供的。

4 个答案:

答案 0 :(得分:4)

您可以使用XmlReader.IsEmptyElement来确定读者是否处于空元素:http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.isemptyelement.aspx

答案 1 :(得分:2)

如果可能,您可以使用LINQ to XML ...

认为它会让一切变得更简单。

http://msdn.microsoft.com/en-us/library/bb387098.aspx

希望它有所帮助...

答案 2 :(得分:0)

我会使用XmlDocument的SelectSingleNode函数,它在解析文件时会更有效。

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode.aspx

如果有多个节点,您可以使用SelectNodes功能。

http://msdn.microsoft.com/en-us/library/4bektfx9.aspx

正如消费者指出的那样,你也可以使用XDocument / XElement解析它。如果您至少使用框架3.5

,这种方法可能更好

答案 3 :(得分:0)


如果你倾向于选择一种性能稍差但更容易管理的方式, 我建议一个类似于以下的解决方案:

    XmlDocument xmlDoc = new XmlDocument();
    List<Entities.Report> reports = new List<Entities.Report>();
    xmlDoc.Load("Read.xml");
    foreach (XmlNode reportNode in xmlDoc.SelectNodes("//ReportSummary"))
    {
        Entities.Report report = new Entities.Report();
        report.ReportName = reportNode["ReportName"].InnerText;
        report.ReportId = reportNode["ReportId"].InnerText;
        reports.Add(report);
    }

更具可读性,可维护性和更低性能 祝你好运!