如何在 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
【讨论】:
但这会给我一个看起来像我就这个主题写了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 模式?的主要内容,如果未能解决你的问题,请参考以下文章