2011-11-08 44 views
1

我在驗證序列化數據時遇到了問題。對XmlSerializer + schemaLocation的困惑

好吧,所以我開始使用從第三方獲得的XSD文件。使用xsd工具生成C#類。然後,我添加了

[XmlAttribute("noNamespaceSchemaLocation", Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] 
public string SchemaLocation = "http://localhost/schemas/AP_Transactions_10052011.xsd"; 

到頂層對象。有問題的URL顯然可以從我運行代碼的機器訪問。然後我使用XmlSerializer,它正確地產生

<?xml version="1.0" encoding="utf-8"?> 
<BU_AP_Vendor_Invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="http://local.com/schemas/AP_Transactions_10052011.xsd"> 
... 
</BU_AP_Vendor_Invoices> 

到目前爲止好其序列。 現在我試圖驗證文件像這樣:

public static void Validate(TextReader xmlData) 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += delegate(object sender, ValidationEventArgs args) 
    { 
     Console.WriteLine(args.Message); 
    }; 

    using (XmlReader xmlReader = XmlReader.Create(xmlData, settings)) 
     while (xmlReader.Read()) ; 
} 

導致Could not find schema information for the element 'element name'警告,在XML文件中的每一個元素。我認爲這意味着XSD不會被加載。

我在看XmlReaderSettings.Schemas,但讀者如何知道要在那裏添加什麼?我認爲,如果我不明確添加模式,那麼魔術就會發生,但這似乎不起作用。

問題是如何正確地做到這一點?

回答

0

請看this post;要點是使用XmlSchemaValidationFlags.ProcessSchemaLocation。

+0

omg我不相信我錯過了。 –