【问题标题】:XmlDocument.Validate not supported attributes or elementsXmlDocument.Validate 不受支持的属性或元素
【发布时间】:2015-12-21 12:10:03
【问题描述】:

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

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

【问题讨论】:

  • 那么您的目标到底是什么,尝试根据 .NET 框架中的特定架构或架构集验证带有 XML 实例文档的字符串?还是使用Validate 方法?如果架构有targetNamespace="http://tempuri.org/VoiceXmlTSPro.xsd",为什么您的实例不声明该命名空间?对于您当前的实例文档,您只会收到有关根元素没有架构的警告。

标签: c# xml xsd xmldocument xml-validation


【解决方案1】:

如果您需要做的只是根据架构验证 XML 标记的字符串,然后使用 StringReader 解析字符串,然后使用正确的 XmlReaderSettings 解析字符串,则无需使用 @987654324 @ 及其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.

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2010-12-19
    • 2013-01-01
    • 1970-01-01
    • 2019-03-17
    • 2018-10-13
    相关资源
    最近更新 更多