【问题标题】:Reordering XML nodes according to defined schema根据定义的模式重新排序 XML 节点
【发布时间】:2010-02-13 21:24:33
【问题描述】:

我正在将几个 .xml 文件合并在一起,并且需要从每个 .xml 文档中获取某些子元素并将它们放入第三个文件中。没关系,但问题是我的“子”节点的顺序有点随机(嗯,我从第一个文件中挑选的,然后是我从第二个文件中挑选的)和模式文件(.xsd ) 将这些孩子定义为“序列”或xs:sequence,如果您愿意的话。因此,输出文件不再通过验证,因为虽然每个文件的元素都按顺序排列,但生成的文件却没有。

我想知道的是,既然我有 .xsd,并且我有一个“大部分”有效的 .xml 文件,那么 C# 中有什么方法可以根据在.xsd 中定义的顺序没有很多痛苦?显然我可以实现一种“排序”,但我希望有一些内置的东西。或者更好的是,自动执行此操作的内置合并也可以工作。

有什么想法吗?

【问题讨论】:

    标签: c# .net xml xsd


    【解决方案1】:

    查看需求,是否可以选择让 XSD 模型指导您?

    您可以将 XSD 加载到 XmlSchema 类中。现在你可以得到模型了。通过遍历模式节点的子节点,您将有保证的顺序。所以,基本上

    • 从 3 个子文档中收集节点并将它们放入工作文档中(还不是目标文档)。
    • 遍历架构定义的结构来构建目标文档
    • 根据模式节点的顺序(按元素名称/命名空间-uri)从工作文档中选择节点并将它们放置在最终的目标文档中

    希望这会有所帮助,

    【讨论】:

      【解决方案2】:

      看看XmlSchemaValidator Class。 Tihs 类执行“基于推送”的验证——它有效地告诉你接下来什么是有效的。也许您可以使用它来重新排序您的 XML。我已经能够使用它来生成符合模式的示例 XML。

      【讨论】:

        【解决方案3】:

        如果您可以控制 .xsd,也许this post 提供了一个起点。

        如果无法更改架构,您仍然可以将 xml 转换为所需的结构。

        【讨论】:

        • 是的,我读到了一种使用“xs:choice”的方法,它可以允许多项选择,但我不一定有 xsd 控件(这是针对大型公司应用程序)。最终我只好进行排序,使用 .xsd 中的顺序和自定义比较器对元素进行排序,然后将它们重新添加回主 XML 文档。
        • @Kevin 很高兴听到你让它工作了。我自己宁愿在输出上使用 xslt,这样我就不会在未来某处被合并结果中的意外变化所困扰。
        猜你喜欢
        • 1970-01-01
        • 2010-12-25
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        相关资源
        最近更新 更多