【问题标题】:Generating XML with an xsd in VS2010 using LINQ使用 LINQ 在 VS2010 中使用 xsd 生成 XML
【发布时间】:2010-08-23 12:03:26
【问题描述】:

我使用过很多 Linq2SQL,并且熟悉大部分概念(包括扩展 ObjectContext),但对于 Linq2XML,我有点迷茫。

我现在需要生成一些复杂的 XML,我想使用 LINQ 的简单性。

以前,我使用过 XMLDocuments 并以编程方式构建元素 - 我希望我能得到一些更优雅的东西。

我收到了 15 多个 xsd 形式的复杂架构 - 其中大多数至少导入一个其他 xsd(常见数据类型),其中一些相互导入

所以我有类似的东西:

文件 1..n

<xsd:schema targetNamespace="http://www.SomeCompany.com"  
    xmlns:SomeCompany="http://www.SomeCompany.com/datatypes_EA"  
    xmlns="http://www.SomeCompany.com" xmlns:dct="http://www.SomeCompany.com/DCTRequestdatatypes"  
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="unqualified">
    <xsd:import namespace="http://www.SomeCompany.com/datatypes_EA"
        schemaLocation="datatypes_EA.xsd" />
        <xsd:import namespace="http://www.SomeCompany.com/DCTRequestdatatypes"
        schemaLocation="DCTRequestdatatypes.xsd" />
    <xsd:element name="DCTRequest">
        <xsd:complexType>
            <blah which references types stored in datatypes_EA.xsd>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

以及另一个包含常用数据类型的文件 (DataTypes_EA.xsd)。

我不得不调整 &lt;import&gt;s 来修复路径问题,但 VS2010 现在显示 0 个错误(编辑器中没有任何下划线)

各种文件 1...n 定义了访问 Web 服务所需的 xml - 因此没有公共根(对于请求类型 1、请求类型 2 等有一个 xsd)

我找到了 xsd.exe 工具来生成类,但是如果我将它指向(比如说)请求类型 1 的架构,我会收到很多架构验证警告 - 说它找不到常见的数据类型(就像它没有读取导入语句一样)并且无法生成任何内容。

理想情况下,我想完全跳过生成类,但如果需要,我会接受它。

简而言之,我如何从我现在的位置开始写如下内容:

Dim Root as new DCTRequest with {.Property = "SomeValue"}
...
Dim ElementsWithSomething = A.SomeElementCollection.Where(function(x) x.PropertyName = "Something")
Dim FinalXML = A.Tostring (or serialize or whatever)

我是不是搞错了?

提前感谢您的帮助

【问题讨论】:

    标签: xml linq visual-studio-2010 xsd


    【解决方案1】:

    要让 xsd.exe 运行,您应该像这样调用它

    xsd.exe schema1.xsd schema2.xsd /c
    

    我想你可以在这里排列所有模式并同时生成所有类。

    当您拥有类时,您不使用 LINQ2XML,而是使用 XmlSerializer 将 XML 文件反序列化为对象。然后,您将常规 LINQ2Objects 与生成的对象图一起使用。

    编辑:因为这似乎不起作用,最后的手段可以是手动合并 XSD 文件。

    【讨论】:

    • 感谢您的回答 - 我在 Rick Strahl 的博客文章中看到了该技术,但是,它仍然产生相同的错误 - 即它试图单独解析每个文件,而不是一次全部加载。我不在办公室,所以明天再试一次并发布结果。
    • 据我所知,这应该工作,但我已经有一段时间没有做一些 xsd 的东西了。根据msdn.microsoft.com/en-us/library/ms950721,你也可以试试 wsdl.exe
    • 抱歉回复慢。这似乎不起作用 - 它确实尝试分析所有文件,但这样做是孤立的(即忽略包含的)。我实际上走了一条不同的路线,并将所有 xsd 合并到一个文件中。这让我可以使用 xsd 工具。如果您愿意更新您的答案以包含该建议,我将标记为正确。如果没有,我会发布我自己的答案 - 但你确实让我的想法走上了正确的道路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多