【发布时间】:2012-08-06 19:26:03
【问题描述】:
为了简单起见,我将大大降低项目的复杂性,并给出一个简单但同样准确的例子来说明我正在努力解决的问题。我有两个 XML 文件,我们将它们命名为 Read.xml 和 Write.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 文件?
提前感谢大家提供的任何内容。
【问题讨论】:
-
任何合适的 XML 解析器都应该能够毫无障碍地处理自闭合标签。我认为 SAX 对它们没有任何问题。
-
您的 XML 有多大?是否值得使用阅读器,或者您可以使用更高级别的 api 解析?
-
如果您正在处理巨大的 Xml 文档,我建议您阅读我在数据库转储中使用过的这个有趣的技术:blogs.msdn.com/b/xmlteam/archive/2007/03/24/…
-
关于为工作选择正确 API 的说明:blogs.msdn.com/b/xmlteam/archive/2011/09/14/…
标签: c# xml xml-parsing