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

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

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

因为“:”是不允许的。

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

【问题讨论】:

    标签: c# xml xsd linq-to-xml


    【解决方案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

    【讨论】:

    【解决方案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 更容易用于此目的。
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 2015-03-25
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多