2011-06-01 61 views
1

我的最終目標是遍歷XSD文檔並如由XSD文檔描述是爲了顯示一個TreeView(Silverlight的4.0)中的所有XML元素的表示。幫助與遍歷複雜的XSD文檔

所以,如果我有這樣的描述一組元素,將看起來像

<a> 
    <b att1="foo" att2="foo2"/> 
    <c /> 
    <d /> 
</a> 

話,我會想顯示像一個TreeView XSD文件:

a 
|_b 
| |_att1 
| |_att2 
| |_c 
|_d 

我不注意XSD文檔是否允許多次出現或可選的元素和屬性。我想列出多次發生的元素,並且所有必需的和可選的元素/屬性都應該出現。例如允許的模式

<a> 
    <b att1="foo" att2="this one was optional"/> 
    <c /> 
    <d /> 
    <d /> 
</a> 

仍然應該返回我以前展示的同一個TreeView。

不過,我無法理解去這樣做的最佳方式。我開始使用XmlReader來運行xsd文檔,但後來發現它可能變得複雜,處理跨文件的引用......例如,具有「ref」或「type」屬性....或「擴展」元素的元素。

所以,我創建了一個WCF服務,所以我可以使用的XmlSchema類,看看在那裏。我寫以下代碼:

XmlTextReader reader = new XmlTextReader("http://myXsdLocation.com/SalesOrder.xsd"); 
XmlSchema myschema = XmlSchema.Read(reader, ValidationCallback); 
XmlSchemaSet schemaSet = new XmlSchemaSet(); 
schemaSet.Add(myschema); 
schemaSet.Compile(); 

調試通過代碼,所述schemaSet計數增加到8 schemaSet.Compile(),之後,我假定意味着,與所有的「包括」在初始XSD文件引用,如就像在引用的xsd文件中一樣,最初的一個xsd文件總共有8個xsd文件是合理的。

但是從schemaSet對象noodling的時候,我還沒有找到一種方法來通過優雅的整個模式橫移,好像它是一個巨大的XSD文件。

有沒有人知道一種方法來完成我想要做的事情?我只是希望能夠按照它作爲一個巨大的XSD文件出現的順序來拉取每個元素,並且將所有屬性附加到該元素並將數據提供給我的TreeView。我用UI的東西沒問題,但需要知道是否最好用XmlReader編寫我自己的解析器或使用XmlSchema和相關的類。我在整個StackOverflow中發現了類似的問題,但其中大部分都引用了代碼gen工具,或者與我正在尋找的工具無關。我想開發一些東西來獲取任何xsd並生成我之前提到的樹。

+1

除非你還在使用.NET 1.1,你不應該使用'新的XmlTextReader()'。您應該改用'XmlReader.Create()'。 – 2011-06-01 23:51:33

回答

0

我不熟悉你引用的XmlSchema API。

解決此問題的另一種方法是使用Saxon模式處理器生成SCM文件,該文件是模式組件模型的XML表示 - 實際上是「規範」形式的編譯模式,它是一種XML表示形式,比原始XSD文件更容易瀏覽。

+0

我對薩克森模式處理器不熟悉。我只想用C#代碼來做到這一點。 – 2011-06-06 15:02:46