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

时间:2015-12-21 12:10:03

标签: c# xml xsd xmldocument xml-validation

如果theire是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>

我想要一个关于application属性和unknow ellement的警告。 但是这段代码不是任何事件。

    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)
        {
            ...
        }
    }

1 个答案:

答案 0 :(得分:0)

如果你需要做的就是针对模式验证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.

输出

{{1}}