错误的命名空间上的.net xml架构验证
发布时间:2020-12-16 22:51:34 所属栏目:百科 来源:网络整理
导读:使用名称空间为http:// mynamespace的 XML模式.如果验证了具有默认命名空间xmlns =“http:// mynamespace”的错误XML文档,则会按预期抛出异常.如果有人更改了命名空间(http:// Wrongnamespace),这个错误的XML将通过验证. 这是使用模式验证的单元测试.方法
使用名称空间为http:// mynamespace的
XML模式.如果验证了具有默认命名空间xmlns =“http:// mynamespace”的错误XML文档,则会按预期抛出异常.如果有人更改了命名空间(http:// Wrongnamespace),这个错误的XML将通过验证.
这是使用模式验证的单元测试.方法XSD_NotValid_2无法正常工作: [TestClass] public class XSDTest { public System.Xml.XmlReaderSettings ReaderSettings { get { string sXSD = "<xsd:schema targetNamespace="http://mynamespace" xmlns="http://mynamespace"" + " xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">" + "<xsd:element name="Root">" + "<xsd:complexType>" + "<xsd:sequence>" + "<xsd:element name="Child" minOccurs="1" maxOccurs="1" />" + "</xsd:sequence>" + "</xsd:complexType>" + "</xsd:element>" + "</xsd:schema>"; System.Xml.Schema.XmlSchema schema = System.Xml.Schema.XmlSchema.Read(new System.IO.StringReader(sXSD),new System.Xml.Schema.ValidationEventHandler(OnValidationFail)); System.Xml.XmlReaderSettings readerSettings_Ret = new System.Xml.XmlReaderSettings(); readerSettings_Ret.ValidationType = System.Xml.ValidationType.Schema; readerSettings_Ret.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(OnValidationFail); readerSettings_Ret.Schemas.Add(schema); return readerSettings_Ret; } } private void OnValidationFail(object s,System.Xml.Schema.ValidationEventArgs e) { throw new OperationCanceledException("Validation error: " + e.Message); } [TestMethod] public void XSD_Valid_Test() { // Valid elements and valid namespace String sXML_Valid = "<?xml version="1.0" encoding="UTF-8"?>" + "<Root xmlns="http://mynamespace"><Child /></Root>"; System.Xml.XmlReader xmlReader_Valid = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_Valid),this.ReaderSettings); while (xmlReader_Valid.Read()) { } // no fail expected } [TestMethod] [ExpectedException(typeof(OperationCanceledException))] public void XSD_NotValid_1() { // No valid elements,while valid namespace String sXML_NotValid_1 = "<?xml version="1.0" encoding="UTF-8"?>" + "<BadRoot xmlns="http://mynamespace"><Child /></BadRoot>"; System.Xml.XmlReader xmlReader_NoValid_1 = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_1),this.ReaderSettings); while (xmlReader_NoValid_1.Read()) ; } [TestMethod] [ExpectedException(typeof(OperationCanceledException))] public void XSD_NotValid_2() { // No valid elements and no valid namespace String sXML_NotValid_2 = "<?xml version="1.0" encoding="UTF-8"?>" + "<Root xmlns="http://Wrongnamespace"><NotValidChild /></Root>"; System.Xml.XmlReader xmlReader_NoValid_2 = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_2),this.ReaderSettings); while (xmlReader_NoValid_2.Read()) ; } } 这是正常的行为吗?如何强制正确的命名空间定位? 解决方法
如果启用架构验证警告,则会收到以下错误:
使用 readerSettings_Ret.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; 一些小东西: >即使在单元测试中,也不应该通过字符串操作来创建XML.始终使用XML API来创建XML,因为他们知道“所有规则”.>即使在单元测试中,也应该使用块来创建实现IDisposable的对象.事实上,我特别说在单元测试中,每个测试应该独立于其他测试,你要确保在开始下一个测试之前已经清理了一个测试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |