使用C#解析XML Schema

3
我正在处理一些在运行时加载xml文件的代码。目前,我们使用XmlDocument类型读取xml文件,并在SelectSingleNode语句周围包装try-catch(这是为了防止节点为空或不存在,因为我们解析用户创建的xml文件)。
请注意:我知道XmlDocument已被XDocument替换。然而,由于我们使用的是.NET版本3(根据此MSDN文档,.NET 3中没有XDocument),我们现在必须坚持使用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文档是否具有正确的格式和所有必需的元素?
1个回答

3

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

您可以使用类似于以下内容的工具。

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

如果您已经对模式进行了验证,并且选择了已知存在的节点,则可以省略每个节点的异常处理,但是显然您应该防范因文件加载等原因导致的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接