我正在爲我的類的自定義(de)序列化邏輯實現IXmlSerializable
,但希望根據XSD模式檢查XML的讀寫情況。我已經加入了XmlSchemaProviderAttribute
:IXmlSerializable針對Schema進行驗證
[XmlSchemaProvider("ConfigSchema")]
[XmlRoot("Config")]
public class Config
{
// properties, fields and methods incl. interface methods
public static XmlQualifiedName ConfigSchema(XmlSchemaSet xs)
{
const string xsdPath = "./Config.xsd";
var serializer = new XmlSerializer(typeof(XmlSchema));
var schema = (XmlSchema)serializer.Deserialize(new XmlTextReader(xsdPath), null);
xs.XmlResolver = new XmlUrlResolver();
xs.Add(schema);
return new XmlQualifiedName("Config", "namespace");
}
}
架構加載罰款和(反)序列化工作正常,但沒有驗證。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ConfigSchema"
targetNamespace="namespace"
elementFormDefault="qualified"
xmlns="namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Config">
<xs:all>
<xs:element name="Config">
<xs:complexType>
<xs:all>
<xs:element name="name" type="xs:string" />
<xs:element name="timeout" type="xs:time" />
<xs:element name="points" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:all>
<xs:element name="a" type="xs:int" />
<xs:element name="b" type="xs:int" />
<xs:element name="c" type="xs:int" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:schema>
如果我反序列化對上面的架構沒有異常被拋出以下(<timeout>
在架構中失蹤,但指定<xs:all>
下):
<?xml version="1.0" encoding="utf-8" ?>
<Config
xmlns:xsi="http://w3.org/2001/XMLScehma-instance"
xsi:schemaLocation="namespace Config.xsd">
<name>some name</name>
...
編輯:下面是我運行它
string path = "./serviceconfig.xml";
var serializer = new XmlSerializer(typeof(Config));
var cfg = (Config)serializer.Deserialize(new XmlTextReader(path), null);
什麼是「正確」/「最好」的方式來驗證輸入/輸出XML反對e模式?
編輯#2:更多信息
下面是完整的XML
<?xml version="1.0" encoding="utf-8" ?>
<Config
xmlns:xsi="http://w3.org/2001/XMLScehma-instance"
xsi:schemaLocation="namespace Config.xsd">
<name>some name</name>
<timeout>10</timeout>
<points>
<point>
<a>5</a>
<b>7</b>
<c>11</c>
</point>
<point>
<a>8</a>
<b>7</b>
<c>3</c>
</point>
</points>
</Config>
我試着尋找到XmlReaderSettings在ReadXml(XmlReader reader)
與沒有幫助以下
var settings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = _schemaSet
};
settings.ValidationEventHandler += (sender, args) => Console.WriteLine(args.Message);
reader = XmlReader.Create(reader, settings);
_schema
從上面的靜態ConfigSchema()
設置。
請發表您的完整架構。另外,究竟是什麼問題?你說你可以反序列化,但是你認爲這是不正確的? –
我不知道如何驗證將對該模式進行序列化的XML。 – clicky
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –