如何在 C# 中动态创建 XML 模式?

Posted

技术标签:

【中文标题】如何在 C# 中动态创建 XML 模式?【英文标题】:How do I dynamically create an XML schema in C#? 【发布时间】:2011-03-29 14:15:45 【问题描述】:

我尝试使用传统的 XElement 和 XAttribute 类从 C# 动态创建 XML 模式 (XSD),但使用冒号指定任何名称都是无效的。也就是说,我无法使用代码创建元素

... = new XElement("xs:element");

因为“:”是不允许的。

那么在 C# 中动态构建模式的正确方法是什么?

【问题讨论】:

【参考方案1】:

要创建架构,您应该使用 XmlSchema 类。下面的链接提供了一个以编程方式创建的综合示例:http://msdn.microsoft.com/en-us/library/9ta3w88s.aspx

示例:

static void Main(string[] args)

    var schema = new XmlSchema();

    // <xs:element name="myElement" type="xs:string"/>
    var myElement = new XmlSchemaElement();
    schema.Items.Add(myElement);
    elementCat.Name = "myElement";
    elementCat.SchemaTypeName = 
        new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");

    // writing it out to any stream
    var nsmgr = new XmlNamespaceManager(new NameTable());
    nsmgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
    schema.Write(Console.Out, nsmgr);

    Console.ReadLine();

【讨论】:

@John:好点子。综合示例确实显示了它,但我现在将更新代码。【参考方案2】:

在创建新的 XML 元素时,您应该注意冒号之前的部分(在本例中为 xs)实际上是 XML 命名空间的别名(在 XSD 中,xs 通常指http://www.w3.org/2001/XMLSchema)。因此,要继续使用 XDocument 构建您的 XSD,您需要使用:

XNamespace ns = new XNamespace("http://www.w3.org/2001/XMLSchema");
... = new XElement(ns + "element");

请参见此处的示例: http://msdn.microsoft.com/en-us/library/bb292758.aspx

【讨论】:

但这会给我一个看起来像 www..."> 而不是 ... 的元素 它在语义上的意思是一样的。如果您想要缩写,我相信您可以在此处添加 Marc 指定的定义:***.com/questions/1265378/…,虽然我自己没有尝试过。 谢谢!连同***.com/questions/1338517/… 这回答了我的问题! :-)【参考方案3】:

我就这个主题写了blog。您可以使用 DataTable 来保存架构。

【讨论】:

我真的很想明确地创建它(而不是通过中间数据结构)以获得完全控制。我可以使用 XElement 和 XAttribute 来做到这一点,只要它们允许在名称中使用“:”。 -1:@Steve,如果你使用DataTable,不是有一些限制吗?比如,您只能创建映射到关系模型的 XML 模式? @John,当然有限制。它创建描述 XML 结构的模式,这些模式可以被 DataTables 读取。根据您的需求,这要么是优点,要么是缺点。 @John...最大的好处是您不必学习模式语言。 如果 OP 说他有兴趣限制“关系”数据,那么我就不会投反对票。没有任何约束使我对一个答案投了反对票,这对可以产生的模式施加了约束。【参考方案4】:

如果你想创建xml,你应该使用XmlWriter类

【讨论】:

我的意思是 xsd 架构是一个 xml。 XmlWriter msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx 拥有创建自定义 xml 的所有方法 您知道XmlDocument 或LINQ to XML 也可用于创建“自定义XML”,而且比直接使用XmlWriter 更容易吗? @John Saunders:不,我没有。我认为XmlDocument 或在使用现有 xml 时会更好,因为它们也支持导航和编辑。来自 MSDN -“XmlWriter 表示一个编写器,它提供了一种快速、非缓存、只转发的方式来生成包含 XML 数据的流或文件。”。你是对的 - LINQ to Xml 更易于使用,但不是基于 XmlWriter 构建的? 是的,它建立在 XmlWriter 之上,这使得它比 XmlWriter 更易于使用。而且我没有说“比”,我说“也”。 XmlDocument 和 LINQ to XML 都比原始 XmlWriter 更容易用于此目的。

以上是关于如何在 C# 中动态创建 XML 模式?的主要内容,如果未能解决你的问题,请参考以下文章

c# 从远程 XML 文件动态添加正则表达式模式

使用 c# 动态构建 XML

创建数组的动态数组[关闭]

msbuild 中动态生成的 C# 文件的问题

动态创建的 Word 文档中缺少打开的 XML 部分

c# winform读取xml文件创建菜单的代码