0

我构建了一个针对 XSd 验证 xml 文件的应用程序。如果在一个节点中发生错误,它会引发异常,在该异常中我只能获得行号和行位置。如何获取该节点的最大长度值。

            MemoryStream xml = new MemoryStream();
            string xsd;
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add("", Application.StartupPath + "\\std_imaging.xsd");
            settings.ValidationEventHandler += MyValidationEventHandler;

            var v = XmlReader.Create(filename, settings);

            while (v.Read())
            {
                string a1 = v.ValueType.Name.Length.ToString();
                string name = v.NodeType + v.Name + v.ValueType + v.Value.ToString();
            }

       public void MyValidationEventHandler(object sender, ValidationEventArgs args)
       {
             schemaResult = false;
             textBox1.Text = textBox1.Text + (Environment.NewLine + args.Message +     
             Environment.NewLine +      "Location(" + args.Exception.LineNumber + 
             "," + args.Exception.LinePosition + ")" + Environment.NewLine);
       }

    this is my code.
4

1 回答 1

0

不久前我遇到了同样的问题,并了解到获取特定节点的架构信息并不像人们想象的那么容易。我鼓励你看看你为什么需要这些信息,以及它是否值得花时间,因为它不是一个简单的解决方案。

如果您对此以及将来有重大需求,最好的解决方案是直接使用IXmlSchemaInfo对象模型,以便您可以读取任何您想要的架构信息。在接受的答案中查看以下问题和此博客文章:

在 C# 中,如何确定元素的 XSD 定义的 MaxLength

IXmlSchemaInfo它向您展示了有关对象模型的大量信息。它基本上涉及大量的类型检查和强制转换。由于您使用XmlReader的是 ,SchemaInfo应该是阅读器的一部分,因此您可以获取当前节点的架构信息。

该博客向您展示了如何读取任何节点的架构信息,实际上并没有将其绑定到验证中,但是您可以轻松地将其调整为在您的验证回调方法中工作。

public void MyValidationEventHandler(object sender, ValidationEventArgs args)
{
    // Using `getMaxLength` method from blog code will return a list of max 
    //  lengths.  If there is more than one, you need to decide how to handle it.
    //  It would also be a good idea to add some addition null checking
    List<int> maxLengths = getMaxLength(sender as XmlReader);

    schemaResult = false;
    textBox1.Text = textBox1.Text + (Environment.NewLine + args.Message +     
        Environment.NewLine + "Location(" + args.Exception.LineNumber + 
        "," + args.Exception.LinePosition + ")" + Environment.NewLine);

}
于 2012-05-22T13:19:26.537 回答