【问题标题】:Help with traversing a complex XSD document帮助遍历复杂的 XSD 文档
【发布时间】: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


【解决方案1】:

这个 MSDN 文档很好地解释了如何遍历 XML 模式:

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

【讨论】:

    【解决方案2】:

    我不熟悉你提到的 XmlSchema API。

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

    【讨论】:

    • 我不熟悉撒克逊模式处理器。我只想用 C# 代码来做这件事。
    猜你喜欢
    • 2021-12-18
    • 2012-08-12
    • 2011-09-26
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多