【问题标题】:Creating an xml file from xsd in .NET在 .NET 中从 xsd 创建 xml 文件
【发布时间】:2009-04-30 18:25:37
【问题描述】:

我想知道解决这个问题的最佳方法: 我想从 xml 模式创建一个空白模板 xml。将创建所有必需的元素和属性,并且它们的值都是空字符串。

下一步是如何确定某个节点可能有哪些子 xml 节点。例如。我会选择一个节点具有 minOccurs="0", maxOccurs="unbounded" 的一个子节点。我将能够确定关于那个孩子的一切、它的属性、它的名字、它的值类型等等。

为了提供更多关于这种情况的背景信息,我正在开发一种工具,该工具允许用户在更用户友好的设置中编辑 xml 文件。例如,他们可以向“account db”节点添加一个新帐户,他们会看到唯一可用的节点是一个帐户节点。接下来,当他们尝试将子节点添加到帐户节点时,选择将是名称节点(必需)、密码节点(必需)、设置节点(可选)等。我如何以编程方式确定帐户节点可用于哪些子节点它以及这些孩子的属性和设置是什么?

这是在带有 .NET 2.0 的 C# 2.0 中。

总而言之,我使用哪些类来读取模式并解析它以获取用于创建 xml 的有用信息?在我的天真中,我曾希望,由于 xsd 本身就是 xml,所以会有某种我可以遍历的 DOM 模型。

我希望这仅限于我的程序,因此不要使用 OxygenXml、VS、xsd.exe 等外部工具。

【问题讨论】:

标签: c# .net xml xsd


【解决方案1】:

听起来您想要在大多数优秀的 XML 编辑器中复制 XML 智能感知背后的功能。即读取一个 xml 架构并计算出接下来可以出现哪些元素和属性。

我们在前段时间从事的一个项目中做了非常相似的事情。生产大部分时间都有效的东西是很多工作,生产一直有效的东西是大量的工作!

基本上您需要加载 XSD(.net 中的 XmlSchema 对象允许您这样做)。但是他们公开的 SOM 对象模型非常原始,因此您需要做很多工作来解释它。如果您忽略替换组、complexType 扩展、变色龙模式和命名空间等概念,您应该能够相当轻松地浏览 SOM。

接下来,您需要确定您在 XML 文档中与您的模式相关的位置。一旦您知道您在 SOM 中,您就可以开始制定可用的选项。

要正确执行此操作需要 1,000' 行代码和 4-12 人周的工作。几周后你们也许可以一起做一些基本的事情?

【讨论】:

  • 是的,这就是我在开始工作时所发现的。为此创建一个库确实需要很多小时。我已经放弃遍历 XmlSchema 对象并挑选和提取我此时需要的信息。
【解决方案2】:

我一直在看 MSDN 文档,我想我已经闻到了气味。 使用 XmlSchema.Read 加载架构并编译它。 Elements 属性将包含“顶级”元素的集合。您必须对根元素的限定名称或其他内容进行硬编码。然后就是这样。我还没有找到如何在给定的架构元素下找到“内容”。

编辑:我找到了更多的路径,但仍然不是很清楚。 XmlSchemaElements 具有架构类型属性。这要么简单,要么复杂。 xml 模式中的复杂类型可以具有属性、序列、组等。序列具有称为粒子的属性,它可以是一个元素。并且循环重复。但我认为实现中的难点在于确保涵盖所有可能的情况(简单类型、带有属性的复杂类型、带有属性和元素的复杂类型、扩展、整个 shebang)。

编辑:使用 XmlSchema 对象的 Element 属性获取 XmlSchemaElement。使用 XmlSchemaElement 的 SchemaType 属性获取简单或复杂类型。使用 XmlSchemaComplexType 的 Attribute 属性获取属性或使用 ContentModel 获取“简单内容”/“复杂内容”或使用 Particle 获取“序列”/“选择”/“全部”。基本上有很多向下移动的属性,检查类型和左右转换对象,并检查 xsd 对象的所有可能排列。创建一个库会很长、很麻烦并且容易出错。这是使用 xml 模式,使用 dtds 我什至不想开始思考。哇,xml 模式是必要的,但为什么它们必须如此邪恶。

【讨论】:

    【解决方案3】:

    您可以使用第三方工具,例如 XMLSPY (link)。它会从 xsd 生成一个虚拟 xml,反之亦然。

    您可以使用计算机上存在的 .NET 工具执行的一种真正迂回(但免费)的方法是使用 xsd.exe (link) 生成您的架构使用以下内容定义的实体对象:

    xsd /classes /language:CS XSDSchemaFile.xsd
    

    然后,当您拥有对象时,将它们加载到项目中并序列化它们。如果您想添加一些虚拟数据,您可以填充属性等。

    【讨论】:

    • 很抱歉没有指出这一点,我希望这仅在我的程序中完成。我想要的最重要的信息是一个方法或类,它允许我解析架构以获取我需要的任何信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多