【发布时间】:2011-03-29 14:15:45
【问题描述】:
我尝试使用传统的 XElement 和 XAttribute 类从 C# 动态创建 XML 模式 (XSD),但使用冒号指定任何名称都是无效的。也就是说,我无法使用代码创建元素
... = new XElement("xs:element");
因为“:”是不允许的。
那么在 C# 中动态构建模式的正确方法是什么?
【问题讨论】:
标签: c# xml xsd linq-to-xml
我尝试使用传统的 XElement 和 XAttribute 类从 C# 动态创建 XML 模式 (XSD),但使用冒号指定任何名称都是无效的。也就是说,我无法使用代码创建元素
... = new XElement("xs:element");
因为“:”是不允许的。
那么在 C# 中动态构建模式的正确方法是什么?
【问题讨论】:
标签: c# xml xsd linq-to-xml
要创建架构,您应该使用 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();
}
【讨论】:
在创建新的 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 来保存架构。
【讨论】:
DataTable,不是有一些限制吗?比如,您只能创建映射到关系模型的 XML 模式?
如果你想创建xml,你应该使用XmlWriter类
【讨论】:
XmlDocument 或LINQ to XML 也可用于创建“自定义XML”,而且比直接使用XmlWriter 更容易吗?
XmlDocument 或在使用现有 xml 时会更好,因为它们也支持导航和编辑。来自 MSDN -“XmlWriter 表示一个编写器,它提供了一种快速、非缓存、只转发的方式来生成包含 XML 数据的流或文件。”。你是对的 - LINQ to Xml 更易于使用,但不是基于 XmlWriter 构建的?