错误命名空间上的.net xml架构验证

错误命名空间上的.net xml架构验证,.net,xml,xsd,xml-validation,.net,Xml,Xsd,Xml Validation,具有命名空间为http://mynamespace。如果使用默认命名空间xmlns=”的错误XML文档http://mynamespace“已验证,然后按预期引发异常。如果有人更改名称空间(http://Wrongnamespace)此错误的XML将通过验证 下面是带有模式验证的单元测试。方法XSD\u NotValid\u 2工作不正常: [TestClass] public class XSDTest { public System.Xml.XmlReaderSettings Rea

具有命名空间为
http://mynamespace
。如果使用默认命名空间
xmlns=”的错误XML文档http://mynamespace“
已验证,然后按预期引发异常。如果有人更改名称空间(
http://Wrongnamespace
)此错误的XML将通过验证

下面是带有模式验证的单元测试。方法
XSD\u NotValid\u 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()) ;
    }
}
[TestClass]
公共类XSDTest
{
public System.Xml.XmlReaderSettings ReaderSettings
{
得到
{
字符串sXSD=“”
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ "";
System.Xml.Schema.XmlSchema=System.Xml.Schema.XmlSchema.Read(新的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.schema.Add(schema);
返回读卡器设置;
}
}
私有void OnValidationFail(对象s,System.Xml.Schema.ValidationEventArgs e)
{
抛出新操作CanceledException(“验证错误:+e.Message”);
}
[测试方法]
公共无效XSD_有效_测试()
{
//有效元素和有效命名空间
字符串sXML_Valid=“”
+ "";
System.Xml.XmlReader XmlReader_有效=
System.Xml.XmlReader.Create(新的System.IO.StringReader(sXML_有效),this.ReaderSettings);
而(xmlReader_Valid.Read()){}//不应失败
}
[测试方法]
[预期异常(类型(操作取消异常))]
公共无效XSD_无效_1()
{
//没有有效元素,而命名空间无效
字符串sXML_NotValid_1=“”
+ "";
System.Xml.XmlReader XmlReader\u NoValid\u 1=
Create(new System.IO.StringReader(sXML\u NotValid\u 1),this.ReaderSettings);
而(xmlReader_NoValid_1.Read());
}
[测试方法]
[预期异常(类型(操作取消异常))]
公共无效XSD_无效_2()
{
//没有有效的元素和有效的命名空间
字符串sXML_NotValid_2=“”
+ "";
System.Xml.XmlReader XmlReader_NoValid_2=
Create(new System.IO.StringReader(sXML\u NotValid\u 2),this.ReaderSettings);
而(xmlReader_NoValid_2.Read());
}
}
这是正常的行为吗?如何强制正确的命名空间目标?
以及在XSD有额外的
Root2
元素的情况下,如何强制要求
Root
元素

如果启用架构验证警告,将出现以下错误:

找不到元素“”的架构信息http://Wrongnamespace:Root"

使用

有几件小事:

  • 即使在单元测试中,也不应该通过字符串操作创建XML。始终使用XMLAPI创建XML,因为他们知道“所有规则”
  • 即使在单元测试中,也应该使用块将实现IDisposable的对象的创建放在
    中。事实上,我要说的是,特别是在单元测试中,每个测试都应该独立于其他测试,您需要确保在开始下一个测试之前,一个测试已经清理完毕

  • 绝对同意。当然,我在VS中构建了XSD。它仅用于演示和快速复制粘贴。
    readerSettings_Ret.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;