我正在编写一些在运行时加载 xml 文件的代码。目前,我们使用 XmlDocument 类型来读取 xml 文件,并在 SelectSingleNode 语句周围包装一个 try-catch(这是在节点为 null 或在我们解析用户时不存在的情况下完成的)创建的 xml 文件)。
请注意:我意识到 XmlDocument 已被 XDocument 取代。然而,由于我们正在使用 .NET 版本 3 (根据这个MSDN文档 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspxXDocument 在 .NET 3 中不可用),我们现在必须坚持使用 XmlDocument。我们出于多种原因使用 .NET 3(其中一些与规范相关)。
这是我们目前正在做的一个示例:
private void LoadUserXMLFile ()
{
XmlDocument xDoc = new XmlDocument();
XmlTextReader reader = new XmlTextReader(fileName);
reader.Read();
xDoc.Load(reader);
try { firstElementString = xDoc.SelectSingleNode(<path to node>).InnderText);
catch { <exception handling here > }
//more SelectSingleNode statements, each wrapped inside
//individual try-catch blocks
}
显然上面是一个例子,我简化了catch语句。
我已经为该应用程序将使用的用户生成的 XML 文件编写了一个架构,我想知道在解析 XML 文档期间是否使用了该架构(以某种方式),我是否仍然需要用 try 包装每个 SelectSingleNode -catch 语句?
是否可以在解析过程中(以某种方式)使用模式来检查 XML 文档是否具有正确的格式和所有必需的元素?
是的,您需要使用验证阅读器
你可以使用这样的东西
XmlTextReader r = new XmlTextReader("C:\\Xml\\MyXmlFile.xml");
v.ValidationType = ValidationType.Schema;
显然,您的 xml 将引用该架构,因此这就是对该架构的引用的解析方式(在 xml 本身中),如下所示
<Employee EmployeeId="12345566"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Employee.xsd">
<PersonName>Krystan</PersonName>
</Employee>
如果您无法更改 xml,您可以像这样使用 XmlReaderSettings
public void SomeMethod()
{
XmlReaderSettings xmlsettings = new XmlReaderSettings();
xmlsettings.Schemas.Add("http://www.company.com/blah", "blah.xsd");
xmlsettings.ValidationType = ValidationType.Schema;
xmlsettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);
XmlReader reader= XmlReader.Create("somefile.xml", xmlsettings);
while (reader.Read()) { }
}
public void ValidationHandler(object sender, ValidationEventArgs args)
void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
Console.Write("WARNING: ");
Console.WriteLine(e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
Console.Write("ERROR: ");
Console.WriteLine(e.Message);
}
}
要回答您的问题,如果您已针对模式进行验证并选择已知存在的节点,您可以免除每个节点的异常处理,但显然您应该防止因文件加载等原因可能发生的异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)