我有一个包含这样一个简单类型的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);`
全局之后 注意 ::.
。现在这个点非常错误,我想我错过了一个命名空间。现在,如果我手动删除点,它的工作正常,但我宁愿不删除每一代的十几个事件。
你有什么想法吗?
答案 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时,你将发送一个外部服务组成他们无法识别的命名空间。LINQ-TO-XSD-CONFIG.xsd
添加到您的项目中。它可以在任何你想要的地方。LinqToXsdConfiguration
此文件的内容应该是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>