在分析 XML 时处理速记结束标记
本文关键字:结束 处理 XML | 更新日期: 2024-10-18 08:23:22
为了简单起见,我将大大降低项目的复杂性,并给出一个简单但同样准确的例子来说明我正在努力解决的问题。我有两个XML文件,我们称它们为Read.xml
和Write.xml
。目标是让我的项目读取 Read.xml 的内容,将 XML 解析为类,然后将其重新生成为 Write.xml。
XML 生成到 Read.xml 中的方式是,当一个元素没有值时,它使用速记结束标记 ( <ElementName />
(,当它有值时,它使用速记结束标记 (<ElementName>Element Value</ElementName>
(。我无法控制 Read.xml 中 XML 的生成。
下面的代码非常适合解析 XML,只要它使用长手结束标记。但是,如果假设下面的ReportId
具有速记结束标记,则现在的代码将读取下一行(对于长手结束标记,这将是 XML 元素的值(,但下一行是值为"'">的空格元素。然后,这会在写入中的 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 文件?
提前感谢大家提供的任何内容。
XmlReader.IsEmptyElement
来确定读取器是否位于空元素:http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.isemptyelement.aspx
可能的话,你可以使用 LINQ to XML...
认为它会让你的一切变得更简单。
http://msdn.microsoft.com/en-us/library/bb387098.aspx
希望对你有帮助...
如果您倾向于采用一种性能较低但更易于管理的方式,我建议一个类似于以下内容的解决方案:
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);
}
更具可读性,可维护性,性能更低。
祝你好运!
我会使用 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,则此方法可能更可取