繁体   English   中英

.NET中的XML验证和命名空间

[英]XML validation and namespaces in .NET

我要做的是针对XSD验证XML。 这一切都非常简单,但我遇到了没有命名空间的XML问题。 如果命名空间与XSD的targetnamespace匹配,则C#仅验证xml。 这似乎是正确的,但是没有命名空间的XML或者SchemaSet不同的XML应该给出异常。 有没有财产或设置来实现这一目标? 或者我是否必须通过读取xml的xmlns属性来手动获取命名空间?

一个清除的例子:

码:

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://example.com", @"test.xsd");
settings.Schemas.Add("http://example.com/v2", @"test2.xsd");
settings.ValidationType = ValidationType.Schema;

XmlReader r = XmlReader.Create(@"test.xml", settings);

XmlReader r = XmlReader.Create(new StringReader(xml), settings);
XmlDocument doc = new XmlDocument();
try
{
    doc.Load(r);
}
catch (XmlSchemaValidationException ex)
{

    Console.WriteLine(ex.Message);
}

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="test">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="[0-9]+\.+[0-9]+" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

有效的XML:

<test xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</test>

无效的XML,这将无法验证:

<hello xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>

错误: The 'http://example.com:hello' element is not declared

XML无效,但会验证,因为名称空间不存在:

<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>

我怎样才能解决这个问题?

任何帮助非常感谢。

xml中无效名称空间未触发XmlSchemaValidationException原因是,因为它只是一个警告。

因此,我们必须更改代码,以便报告警告。

第一步 :在XmlReaderSettings设置Validationflags属性

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings;

PS:通过设置验证标志,确保设置所需的所有标志,否则将跳过一些验证标志。 我正在使用ProcessIdentityConstraints ,因此我的身份约束(xs:key,xs:keyref,...)也被验证。 有关详细信息,请访问http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspx

下一步 :告诉验证者报告警告时该怎么做。 创建一个Validator事件,该事件将在发生警告或错误时触发

private static void SchemaValidatorHandler(object sender, ValidationEventArgs e)
    {
        if (e.Severity == XmlSeverityType.Warning || e.Severity == XmlSeverityType.Error)
        {
            //Handle your exception
        }



    }

上一个 :设置要用于验证的验证程序事件处理程序

settings.ValidationEventHandler += new ValidationEventHandler(SchemaValidatorHandler);

而已

我可以找到XmlDocument.Validate()的方法
http://msdn.microsoft.com/en-us/library/ms162371.aspx

我相信如果XmlDocument中存在错误并且命名空间不匹配则会引发异常会抛出警告。 您可以阅读有关XmlValidation和错误类型的更多信息。 http://msdn.microsoft.com/en-us/library/aa310912%28v=vs.71%29.aspx

粘贴在msdn的一些摘录下面
警告如果调用ValidationEventHandler并传递等于XmlSeverityType.Warning的ValidationEventArgs.Severity,则继续处理文档。 抛出异常并继续处理模式文档。 错误如果调用ValidationEventHandler并传递等于XmlSeverityType.Error的ValidationEventArgs.Severity,则继续处理文档并丢弃无效数据。 抛出异常并停止处理架构文档。
希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM