4
使用命名空間爲http://mynamespace
的XML模式。如果驗證了默認名稱空間爲xmlns="http://mynamespace"
的錯誤XML文檔,則按預期拋出異常。而如果有人更改名稱空間(http://Wrongnamespace
),則此錯誤的XML將通過驗證。.net錯誤名稱空間上的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()) ;
}
}
這是正常行爲嗎?如何強制正確的命名空間定位? 還有如何強制要求Root
元素的情況下XSD有額外的Root2
元素?
絕對同意。當然,我在VS中構建了XSD。它僅用於演示目的和快速複製粘貼。 – Artru 2012-08-13 14:10:23