2009-05-01 135 views
0

解決 元件位置我使用XML模式文件來驗證傳入的數據文件,但是該架構出現在運行時編譯過程中失敗,因爲它指的是一個複雜的類型,其外部架構的一部分。外部模式在文檔頂部的 <xs:import>元素中指定。我以爲它可能是一個訪問問題,所以我將外部文檔的一個副本移動到本地主機文件夾。我得到了同樣的錯誤,所以現在我想知道是否使用 <xs:import>元素可能會出現某種問題。 麻煩在C#

模式文檔片段看起來是這樣的:

<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:cpl="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
... 
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd"/> 
... 
<xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/> 
... 
</xs:schema> 

我試圖與運行該代碼是真正的簡單

string XSDFILEPATH = @"http://localhost/TMSWebServices/XMLSchema/CPL.xsd"; 
string XMLFILEPATH = @"C:\foo\bar\files\TestCPLs\CPL_930f5e92-be03-440c-a2ff-a13f3f16e1d6.xml"; 

System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings(); 
settings.Schemas.Add(null, XSDFILEPATH); 
settings.ValidationType = System.Xml.ValidationType.Schema; 

System.Xml.XmlDocument document = new System.Xml.XmlDocument(); 
document.Load(XMLFILEPATH); 

System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(new StringReader(document.InnerXml), settings); 
while (rdr.Read()) 
{ 

} 

一切順利,直到(從http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/06/validate-xml-against-xsd-xml-schema-using-c.aspx得到它)該行在while循環之前實例化XMLReader對象。然後它失敗,類型沒有聲明錯誤。它試圖找到的類型KeyInfoType在import元素的其中一個文檔中定義。我確定命名空間是一致的。我想知道命名空間定義中的#號是否引起問題,但刪除它們沒有效果,它只是改變了錯誤的樣子(即「類型'http://www.w3.org/2000/09/xmldsig:KeyInfoType'未聲明。」與「類型'http://www.w3.org/2000/09/xmldsig#:KeyInfoType'不是聲明。「)

我懷疑是有一些關於<xs:import>元素我缺少的處理。任何建議都非常受歡迎。謝謝!

回答

0

我認爲你需要添加只需一行代碼,使其工作:

settings.ValidationFlags = 
     System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation; 

馬克

+0

我試過這一行,但沒有任何效果。我看着ProcessSchemaLocation標誌,發現的例子,我已經看到了使用複合運算符(新的我): settings.ValidationFlags | = System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation; 不幸的是,也沒有工作。我想,我會繼續阻止它。謝謝! – BobC 2009-05-01 21:27:41

0

好吧,這是有點莫名其妙。我試圖做到這一點的幾個不同的方式,包括添加一行:

settings.ValidationFlags |= System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation; 

和我不斷收到同樣的錯誤:

Type 'http://www.w3.org/2000/09/xmldsig#:KeyInfoType' is not declared. 

通過該命名空間中指定的文件是:

http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd 

該文檔可從我所在的位置訪問,並且我可以在152行找到(看似)有問題的KeyInfoType類型。

爲了好玩,我檢查了正在驗證的文檔,並發現在此類型的模式中定義的元素不在文檔中。模式將其定義爲可選(minOccurs =「0」),所以這不是問題。

這幾乎就像有一些奇怪的有關框架的編譯schmea文檔時,該文檔導入外部架構文件的能力。有沒有人看過這種行爲?谷歌沒有證明這個問題富有成效,雖然它給了我一些嘗試的建議。謝謝!