2

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

XML 生成到Read.xml中的方式是,当元素没有值时,它使用速记结束标记 ( <ElementName />),而当它确实有值时,它使用速记结束标记 ( <ElementName>Element Value</ElementName>)。我无法控制Read.xml中 XML 的生成。

下面的代码非常适合解析 XML,只要它使用普通结束标记。但是,如果 ReportId下面说要使用速记结束标记,那么现在的代码将读取下一行(对于长手写结束标记将是 XML 元素的值),但下一行是一个空格值为"\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

4 回答 4

4

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

于 2012-08-06T19:34:40.747 回答
2

如果可能的话,你可以使用 LINQ to XML ......

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

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

希望能帮助到你...

于 2012-08-06T19:36:18.353 回答
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

正如 spender 指出的那样,您还可以使用 XDocument/XElement 解析它。如果您至少使用框架 3.5,这种方法可能更可取

于 2012-08-06T19:34:28.297 回答
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);
    }

更具可读性,可维护性和性能稍差。
祝你好运!

于 2012-08-06T19:36:22.090 回答