Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中动态创建XML模式?_C#_Xml_Xsd_Linq To Xml - Fatal编程技术网

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

如何在C#中动态创建XML模式?,c#,xml,xsd,linq-to-xml,C#,Xml,Xsd,Linq To Xml,我尝试使用传统的XElement和XAttribute类从C#动态创建XML模式(XSD),但使用冒号指定任何名称都是无效的。也就是说,我无法使用代码创建元素 ... = new XElement("xs:element"); 因为不允许使用“:” 那么,在C语言中动态构建模式的正确方法是什么呢?我写了一篇关于这个主题的文章。可以使用DataTable保存架构。如果要创建xml,则应使用XmlWriter类创建新xml元素时,应注意冒号前面的部分(在本例中,xs)实际上是xml命名空间的别名(

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

... = new XElement("xs:element");
因为不允许使用“:”


那么,在C语言中动态构建模式的正确方法是什么呢?

我写了一篇关于这个主题的文章。可以使用DataTable保存架构。

如果要创建xml,则应使用XmlWriter类创建新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");
请参见此处的示例:

要创建模式,您应该使用XmlSchema类。下面的链接提供了一个以编程方式创建模式的综合示例:


例如:

static void Main(字符串[]args)
{
var schema=new XmlSchema();
// 
var myElement=new XmlSchemaElement();
schema.Items.Add(myElement);
elementCat.Name=“myElement”;
elementCat.SchemaTypeName=
新的XmlQualifiedName(“字符串”http://www.w3.org/2001/XMLSchema");
//将其写入任何流
var nsmgr=newxmlnamespacemanager(newnametable());
nsmgr.AddNamespace(“xs”http://www.w3.org/2001/XMLSchema");
schema.Write(Console.Out,nsmgr);
Console.ReadLine();
}

我真的很想显式地创建它(而不是通过中间数据结构)以获得完全控制权。如果允许的话,我可以使用XElement和XAttribute来实现这一点:在名称中。-1:@Steve,如果您使用
数据表
,是否有一些限制?例如,您只能创建映射到关系模型的XML模式?@John,当然有限制。它创建描述可由数据表读入的XML结构的模式。根据您的需要,这是一个优点还是缺点@John…最大的好处是你不必学习模式语言。如果OP说他对“关系”感兴趣数据,那么我就不会投反对票了。由于没有任何约束,我的反对票成为了对可以生成的模式施加约束的答案。我的意思是xsd模式是一种xml。XmlWriter拥有创建自定义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更易于使用。但这会给我一个元素,它看起来像,而不是…它在语义上的意思是一样的。如果你想要缩写,我相信你可以添加这里指定的定义:,尽管我自己没有尝试过。谢谢用这个回答了我的问题!:-)@John:说得好。综合示例确实显示了这一点,但我将立即更新代码。
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();
}