XmlDocument.Validate 不支持的属性或元素

XmlDocument.Validate not supported attributes or elements

如果 xml 中的属性或元素未在 xsd 中定义,我如何获取 ValidationEvents。

xsd:

    <?xml version="1.0" encoding="utf-8"?>
    <xsd:schema id="VoiceXmlTSPro"
                targetNamespace="http://tempuri.org/VoiceXmlTSPro.xsd"
                elementFormDefault="qualified"
                xmlns="http://tempuri.org/VoiceXmlTSPro.xsd"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!-- Elements-->
    <xsd:element name="vxml">
     <xsd:complexType>
      <xsd:attribute ref="base"/>
      <xsd:attribute ref="lang"/>
      </xsd:complexType>
     </xsd:element> 
       <!-- End Elements-->
       <!-- Attributes-->
       <xsd:attribute name="base" type="xsd:anyURI">
     </xsd:attribute>
     <xsd:attribute name="lang" type="xsd:string"> 
     </xsd:attribute>
    <!-- End Attributes-->
  </xsd:schema>

xml:

    <?xml version="1.0" encoding="utf-8" ?>
     <vxml application="notsupported" lang="en-US"     base="http://www.zebra.com">
       <unknow></unknow>
      </vxml>

我想要针对应用程序属性和未知元素的警告。 但是这段代码没有处理任何事件。

    public override void Validate(string source)
    {
        ValidationResults.Clear();
        XmlSchemaFactory xmlSchemaFactory = new XmlSchemaFactory();
        XmlReaderSettings vxmlTestSettings = new XmlReaderSettings();
        vxmlTestSettings.ValidationType = ValidationType.Schema;
        vxmlTestSettings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints| XmlSchemaValidationFlags.ReportValidationWarnings ;
        try
        {
            XmlSchema xsdSchema = xmlSchemaFactory.Create(Resource.VoiceXmlTSPro);
            if (xmlSchemaFactory.HasErrors())
            {
                // if the schema is invalid the read wil not read
                return;
            }
            vxmlTestSettings.Schemas.Add(xsdSchema);
            ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationHandler);

            using (MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(source)))
            using (XmlReader xmlReader = XmlReader.Create(stream, vxmlTestSettings))
            {
                XmlDocument document = new XmlDocument();
                document.Load(xmlReader);
                document.Validate(eventHandler);
            }
        }
        catch (Exception ex)
        {
            ...
        }
    }

如果您需要做的就是根据架构验证 XML 标记的字符串,然后使用 XmlReader 解析字符串,而不是 StringReader 并使用适当的 XmlReaderSettings应该做的,没有必要使用 XmlDocument 及其 Validate 方法。

这是一个示例,对于第一个示例,它仅输出警告,因为输入文档没有命名空间声明,对于第二个文档,存在关于未声明的元素和属性的错误:

    static void Main(string[] args)
    {
        string[] xmls = { @"<vxml application=""notsupported"" lang=""en-US""     base=""http://www.zebra.com"">
   <unknow></unknow>
  </vxml>",
        @"<vxml application=""notsupported"" lang=""en-US""     base=""http://www.zebra.com"" xmlns=""http://example.com/ns1"">
   <unknow></unknow>
  </vxml>"
                        };

        foreach (string xml in xmls)
        {
            Console.WriteLine("Validating");
            Validate(xml, "../../schema1.xml");
            Console.WriteLine();
        }
    }

    static void Validate(string xmlMarkup, string schemaUri)
    {
        XmlReaderSettings xrs = new XmlReaderSettings();
        xrs.Schemas.Add(null, schemaUri);
        xrs.ValidationType = ValidationType.Schema;
        xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        xrs.ValidationEventHandler += (obj, valArgs) =>
        {
            Console.WriteLine("{0}: {1}", valArgs.Severity, valArgs.Message);
        };

        using (StringReader sr = new StringReader(xmlMarkup))
        {
            using (XmlReader xr = XmlReader.Create(sr, xrs))
            {
                while (xr.Read()) { }
            }
        }
    }

架构是

<?xml version="1.0" encoding="utf-8" ?> 
<xsd:schema id="VoiceXmlTSPro"
                targetNamespace="http://example.com/ns1"
                elementFormDefault="qualified"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!-- Elements-->
    <xsd:element name="vxml">
     <xsd:complexType>
      <xsd:attribute name="base" type="xsd:anyURI"/>
      <xsd:attribute name="lang" type="xsd:string"/>
      </xsd:complexType>
     </xsd:element> 
       <!-- End Elements-->

  </xsd:schema>

输出是

Validating
Warning: Could not find schema information for the element 'vxml'.
Warning: Could not find schema information for the attribute 'application'.
Warning: Could not find schema information for the attribute 'lang'.
Warning: Could not find schema information for the attribute 'base'.
Warning: Could not find schema information for the element 'unknow'.

Validating
Error: The 'application' attribute is not declared.
Error: The element cannot contain white space. Content model is empty.
Error: The element 'http://example.com/ns1:vxml' cannot contain child element 'http://example.com/ns1:unknow' because the parent element's content model is empty.