.net - 在 C# 中使用模式进行 XML 解析

标签 .net xml c#-3.0 xsd

我正在编写一些在运行时加载 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?

是否有可能在解析过程中(以某种方式)使用模式来检查 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/

相关文章:

.net - XML 文件中日期/时间的正确格式是什么

sql - Xquery 获取连续的不同值

"is"关键字的 C# 使用模式

c# - 我们如何在#中检查一个数组是否包含另一个数组的一个或多个元素?

C# NetworkStream 数据丢失

android - android xpath 中的 "TransformerException: A location step was expected"

c#-3.0 - Lambda for Dummies....任何人,任何人?我想不是

asp.net - 为什么在调用 Asp.Net ListBox 自动回发方法时会调用不相关的(自动回发)方法?

.net - Web服务异步方法的使用

c# - 接口(interface)上的保守 IDisposable 标记