【发布时间】:2011-06-01 21:04:45
【问题描述】:
我的最终目标是遍历 XSD 文档并按照 XSD 文档所述的顺序显示所有 XML 元素的 TreeView (Silverlight 4.0) 表示。
所以,如果我有一个 XSD 文件,它描述了一组看起来像这样的元素
<a>
<b att1="foo" att2="foo2"/>
<c />
<d />
</a>
然后我想显示一个像这样的 TreeView:
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”属性的元素......或“extension”元素。
所以,我创建了一个 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 计数在 schemaSet.Compile() 之后增加到 8,我假设这意味着在初始 xsd 文件以及引用的 xsd 文件中的所有“包含”引用,有共有 8 个 xsd 文件,第一个文件才有意义。
但是通过在 schemaSet 对象中闲逛,我还没有找到一种方法来优雅地遍历整个架构,就好像它是一个巨大的 XSD 文件一样。
有没有人知道一种方法来完成我想要做的事情?我只是希望能够按照显示为一个巨大 XSD 文件的顺序提取每个元素,以及附加到该元素的任何属性并将数据提供给我的 TreeView。我对 UI 的东西没意见,但需要知道用 XmlReader 编写我自己的解析器还是使用 XmlSchema 和相关类更好。我在整个 StackOverflow 中都发现了类似的问题,但其中大部分都引用了代码生成工具,或者与我正在寻找的内容无关。我想开发一些东西来获取任何 xsd 并生成我之前提到的树。
【问题讨论】:
-
除非您仍在使用 .NET 1.1,否则不应使用
new XmlTextReader()。你应该改用XmlReader.Create()。
标签: c# xml silverlight-4.0 treeview xsd