使用带有LINQ to XSD的命名简单类型会导致编译器错误

时间:2011-01-14 14:30:04

标签: c# xsd linq-to-xsd

我有一个包含这样一个简单类型的XSD:

<xs:simpleType name="csharpName" id="csharpName">
    <xs:restriction base="xs:string">
        <xs:pattern value="[A-Za-z][A-Za-z0-9_]*" />
    </xs:restriction>
</xs:simpleType>

现在我使用这种类型:

 <xs:element name="typeName" type="csharpName" />

LINQ to XSD生成

this.SetElementWithValidation(XName.Get("typeName", ""), value, "typeName", global::.csharpName.TypeDefinition);`
全局之后

注意 ::.。现在这个点非常错误,我想我错过了一个命名空间。现在,如果我手动删除点,它的工作正常,但我宁愿不删除每一代的十几个事件。 你有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我已经解决了,自定义类型需要这样的命名空间:

<xs:schema
    attributeFormDefault="unqualified"
    elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://codegen"
    xmlns:codegen="http://codegen">

然后使用带有codegen前缀的类型。

答案 1 :(得分:2)

我在最近几个小时里学到了很多东西:

  • 正如@TDaver所说,需要一个命名空间来避免生成代码中的::.。我希望能够用Custom Tool Namespace属性以某种方式覆盖它,但这看起来不起作用。我只需要为我正在使用的某些Amazon XSD添加一个组合的命名空间,并接受如果XSD更改我需要再次执行此操作的事实。

  • 早期版本的Linq2XSD项目没有这个问题,有些东西发生了变化 - 所以如果你使用nuget软件包重新编译你之前只使用过下载过的DLL那么你可能会看到这个问题你没有以前有它。

  • 重要提示:项目的所有XSD文件都会编译为LinqToXsdSource.cs个文件。这是非常重要的,因为您可能正在查找错误的XSD文件以查找错误。

  • 您可能需要关注包含文件LinqToXsdSource.cs的obj \ Debug文件夹。如果您遇到问题,可能只想吹掉这个文件夹,或者只是保持打开以监控错误。

答案 2 :(得分:2)

好的,这是真正正确的答案! (我正在使用nuget Linq2Xsd package

提问者原始解决方案有一个很大的问题,那就是如果你要将自己的命名空间添加到外部XSD只是为了防止这个错误,当你尝试生成XML时,你将发送一个外部服务组成他们无法识别的命名空间。

  • 首先删除任何已添加的命名空间和targetNamespace。
  • 然后只需将文件LINQ-TO-XSD-CONFIG.xsd添加到您的项目中。它可以在任何你想要的地方。
  • 将构建操作设置为LinqToXsdConfiguration
  • NB:只要具有此构建操作,就可以随意调用该文件。

enter image description here

此文件的内容应该是Clr类型的所有命名空间和映射的列表。 请记住,DLL中的每个模式都是通过相同的\obj\Debug\LinqToXsdSource.cs文件编译的,因此您需要为项目中使用的每个XSD添加每个命名空间。

此处的关键是您放置默认值的空命名空间。这样可以避免::.问题

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="http://www.microsoft.com/xml/schema/linq">
  <Namespaces>
    <Namespace Schema="http://example.com/idr" Clr="example.com.idr"/>
    <Namespace Schema="" Clr="LinqXsdGenericNamespace"/>
  </Namespaces>
</Configuration>

另请参阅:http://linqtoxsd.codeplex.com/discussions/238570