帮助遍历复杂的XSD文档

时间:2011-06-01 21:04:45

标签: c# xml silverlight-4.0 treeview xsd

我的最终目标是遍历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文件中包含所有“include”引用,总共8个xsd文件,对于初始文件来说是有意义的。

但是,从schemaSet对象中的noodling,我还没有找到一种方法来优雅地遍历整个模式,就像它是一个巨大的XSD文件一样。

有没有人知道如何完成我想要做的事情?我只是希望能够按照它看起来像一个巨大的XSD文件的顺序拉出每个元素,并将任何属性附加到元素并将数据提供给我的TreeView。我对UI的东西很好,但是需要知道用XmlReader编写我自己的解析器或者使用XmlSchema和相关类是否更好。我在StackOverflow中发现了类似的问题,但大多数都引用了代码生成工具,或者与我正在寻找的内容无关。我想开发一些东西来接受任何xsd并生成我之前提到的树。

2 个答案:

答案 0 :(得分:1)

此MSDN文档非常好地解释了如何遍历XML模式:

http://msdn.microsoft.com/en-us/library/ms255932.aspx

答案 1 :(得分:0)

我不熟悉您所引用的XmlSchema API。

解决这个问题的另一种方法是使用Saxon模式处理器生成一个SCM文件,它是模式组件模型的XML表示 - 实际上是“规范”形式的编译模式,这是一种XML表示形式。比原始XSD文件更容易导航。