【问题标题】:Create XSD from XML in Code在代码中从 XML 创建 XSD
【发布时间】:2014-04-03 11:09:47
【问题描述】:

我正在使用MSDN 中的这段代码从 XML 创建 XSD

XmlReader reader = XmlReader.Create("contosoBooks.xml");
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference schema = new XmlSchemaInference();

schemaSet = schema.InferSchema(reader);

foreach (XmlSchema s in schemaSet.Schemas())
{
   textbox.text = s.ToString();
}

我想根据我的 xml 文件输出 .xsd。当我生成 .xsd 文件时,我得到的唯一内容是:System.Xml.Schema.XmlSchema

当我使用 Visual Studio 选项生成 XSD 来创建架构时,它会正确显示。但是,我有超过 150 个 xml 文档需要创建 XSD,因此需要一个编程选项。有人可以帮忙吗?

【问题讨论】:

  • 了解一下上下文会很有帮助

标签: c# xml xsd


【解决方案1】:

xsd.exe可以为所欲为:

如果您指定 XML 文件(.xml 扩展名),Xsd.exe 会推断架构 从文件中的数据生成 XSD 架构。输出文件 与 XML 文件同名,但扩展名为 .xsd。

以下命令从 myFile.xml 生成 XML 模式并将其保存到指定目录。

xsd myFile.xml /outputdir:myOutputDir

您可以在herehere 阅读更多相关信息

您可以像这样以编程方式尝试:

XmlReader reader = XmlReader.Create(@"yourxml.xml");
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference schema = new XmlSchemaInference();
schemaSet = schema.InferSchema(reader);

foreach (XmlSchema s in schemaSet.Schemas())
{
    using (var stringWriter = new StringWriter())
    {
        using (var writer = XmlWriter.Create(stringWriter))
        {
            s.Write(writer);
        }

        textbox.text = stringWriter.ToString();
    }
}

【讨论】:

    【解决方案2】:

    这就是你所缺少的...... 而不是简单地做s.ToString(),这样做:

    XmlWriter writer;
    int count = 0;
    foreach (XmlSchema s in schemaSet.Schemas())
    {
        writer = XmlWriter.Create((count++).ToString() + "_contosobooks.xsd");
        s.Write(writer);
        writer.Close();
        Console.WriteLine("Done " + count);
    }
    reader.Close();
    

    然后您可以编写适当的逻辑来更优雅地进行读/写,读取许多 xml 文件并创建相应的 xsd 文件等。

    我从这里获取了 contosobooks.xml: https://code.google.com/p/code4cs/source/browse/trunk/AppCase/dNet/Xml/data/contosoBooks.xml?spec=svn135&r=135

    输出 xsd 为:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="bookstore">
            <xs:complexType>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="book">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="title" type="xs:string" />
                                <xs:element name="author">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element minOccurs="0" name="name" type="xs:string" />
                                            <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                            <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                                <xs:element name="price" type="xs:decimal" />
                            </xs:sequence>
                            <xs:attribute name="genre" type="xs:string" use="required" />
                            <xs:attribute name="publicationdate" type="xs:date" use="required" />
                            <xs:attribute name="ISBN" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    【讨论】:

      【解决方案3】:

      下载 microsoft visual studio 2010 或 2012。非常简单。只需在 .xml 文件上单击鼠标右键,然后选择 microsft Visual Studio,然后您将看到 xml 选项卡,然后单击 xml 架构。它会生成xsd,保存到本地。

      【讨论】:

        【解决方案4】:

        使用命令行工具xsd.exe

        示例用法:

        nameOf.xsd /c /n:yourNamespace /out:C:\path\to\save

        /c 参数创建一个类(与创建强类型数据集的 /dataset 相反)

        您通常可以在以下位置找到它:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

        然后使用批处理文件或 Powershell 创建所有 150 个类。

        【讨论】:

        • 我偶然发现了这个线程,寻找相关的问答。关于你的否决票,我猜有人可能试图在命令行输入“nameOf.xsd”而不是“xsd nameOf.xsd ...”。您在几分钟内提供的其他答案似乎更完整,因此与其他人相比,有人可能纯粹对您的答案投了反对票(不是很好的形式)。而且您建议使用 xsd 周围的批处理文件,它将代码工作从 C# 转移到 shell 脚本。嗯,我也不会喜欢那个,但我不会因此而失望你。 HTH
        • 他想创建 150 个这样的 xsd。人们会期望为此编写的任何代码都是一次性代码。你可以写 1 行 PS 或 50 行 C#...
        【解决方案5】:

        我使用这个命令行:

        Administrator:Developer Command Prompt for VS2013
        

        从 xml 创建 xsd 文件:

        xsd FullFilePath.xml /outputdir:myOutputDir
        

        生成对象来表示我们项目中的那个 xsd 文件。

        xsd /c /n:myNameSpace FullPath\fileName.xsd
        

        然后它会告诉 .cs 文件是在哪里创建的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          相关资源
          最近更新 更多