【问题标题】:XML Parsing using a schema in C#在 C# 中使用模式进行 XML 解析
【发布时间】:2012-03-26 08:12:56
【问题描述】:

我正在编写一些在运行时加载 xml 文件的代码。目前,我们正在使用 XmlDocument 类型来读取 xml 文件并在 SelectSingleNode 语句周围包装一个 try-catch (这是在节点为空的情况下完成的,或者在我们解析用户时不存在创建的 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 文档期间(以某种方式)使用了架构,我是否还需要包装每个SelectSingleNode 与 try-catch 语句?

在解析过程中是否可以(以某种方式)使用模式来检查 XML 文档是否具有正确的格式和所有必需的元素?

【问题讨论】:

    标签: .net xml c#-3.0 xsd


    【解决方案1】:

    是的,您需要使用验证阅读器

    你可以使用这样的东西

    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);
        }
    }
    

    如果您已针对架构进行验证并选择已知存在的节点,则要回答您的问题,您可以省去每个节点的异常处理,但显然您应该防范可能由于文件加载等而发生的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2013-07-18
      • 1970-01-01
      • 2013-03-25
      • 2019-09-27
      相关资源
      最近更新 更多