我正在使用.NET XSD.EXE导入程序从一组XSD文件生成C#类。当我尝试将其中一个类序列化为XML时,它失败了( InvalidOperationException ),当我挖到它时,我发现其中一个创建的类看起来是错误的。
以下是相关的XSD代码:
<xsd:complexType name="SuccessType">
<xsd:annotation>
<xsd:documentation>Indicates in a response message that a request was successfully processed.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="Warnings" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- .. snip .. -->
<xsd:element name="Warnings" type="WarningsType">
<xsd:annotation>
<xsd:documentation>The processing status of a business message and any related warnings or informational messages.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<!-- .. snip .. -->
<xsd:complexType name="WarningsType">
<xsd:annotation>
<xsd:documentation>A collection of warnings generated by the successful processing of a business message.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="Warning" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- .. snip .. -->
<xsd:element name="Warning" type="WarningType">
<xsd:annotation>
<xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<!-- .. snip .. -->
<xsd:complexType name="WarningType">
<xsd:annotation>
<xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="WarningCategory"/>
<xsd:element ref="WarningCode"/>
<xsd:element ref="WarningShortMessage"/>
<xsd:element ref="WarningMessage"/>
</xsd:sequence>
</xsd:complexType>
这是从它生成的C#代码:
public partial class SuccessType
{
private WarningType[][] warningsField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType), IsNullable = false)]
public WarningType[][] Warnings
{
get
{
return this.warningsField;
}
set
{
this.warningsField = value;
}
}
}
它使Warnings
成为WarningType
数组的数组。当我尝试将其序列化为XML时,我得到 InvalidOperationException
例外:
但是,如果我将生成的代码从WarningType[][]
更改为WarningType[]
,那么它会很好地序列化。
每当我重新生成这个时,编辑生成的C#类是不够的(希望将来不那么频繁),还有其他解决方案吗?这是xsd.exe中的错误还是XSD文件不正确?也许XmlSerializer存在问题?
我想要的是是正确序列化为对XSD进行验证的XML的C#代码。现在,锯齿状数组似乎是错误的,因为如果我删除它,那么它会生成XML。
我正在使用Visual Studio 2008.
答案 0 :(得分:4)
xsd.exe工具中存在错误。我不记得这个特别的,但我确实记得发现锯齿状阵列的问题,这可能仍然是一个错误。如果您愿意,可以使用同样来自Microsoft的XsdObjbectGen工具,但可以从.NET SDK中独立发布并带外发布。
您可以做的一件事是反向:编写C#代码,然后使用xsd.exe生成架构,看看有什么不同。 xsd.exe可能希望模式以特定方式呈现,以便为锯齿状数组正确生成正确的代码。
实际上,在重新阅读你的问题时,你从未说过你真正想要的东西。您是否希望SuccessType包含数组数组?
是 WarningsType 还是 WarningType ?您提供的代码剪辑之间存在一些分歧。
假设你想要数组数组,我写了这个C#代码:
public class WarningType
{
public String oof;
}
public partial class SuccessType
{
private WarningType[][] warningsField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType[]), IsNullable = false)]
public WarningType[][] Warnings
{
get
{
return this.warningsField;
}
set
{
this.warningsField = value;
}
}
}
...然后将其编译成DLL。然后我在该DLL上运行了xsd.exe,并生成了这个XSD:
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="WarningType" nillable="true" type="WarningType" />
<xs:complexType name="WarningType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="oof" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="SuccessType" nillable="true" type="SuccessType" />
<xs:complexType name="SuccessType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Warnings" type="ArrayOfArrayOfWarningType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfArrayOfWarningType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Warning" type="ArrayOfWarningType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfWarningType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="WarningType" nillable="true" type="WarningType" />
</xs:sequence>
</xs:complexType>
</xs:schema>
......它往返旅行。如果我然后在该架构上运行xsd.exe,我得到一个包装数组数组的类型。