我正在编写一些在运行时加载 xml 文件的代码。目前,我们正在使用 XmlDocument 类型来读取 xml 文件,并在 SelectSingleNode 语句周围包装一个 try-catch(这是在节点为 null 的情况下完成的,或者在我们解析用户时不存在)创建的 xml 文件)。
请注意:我发现 XmlDocument 已被 XDocument 取代。但是,由于我们使用的是 .NET 版本 3(according to this MSDN document XDocument 在 .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-catch 语句的 SelectSingleNode?p>
是否有可能在解析过程中(以某种方式)使用模式来检查 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);
}
}
回答你的问题,如果你已经验证了一个模式并且正在选择已知的节点,你可以免除每个节点的异常处理,但显然你应该防止由于文件加载等原因可能出现的异常。
关于.net - 在 C# 中使用模式进行 XML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868669/