我在尝试将xml反序列化为.NET中的类时遇到错误。 我使用.net xsd工具获取了一个xml文件并从中创建了一个xsd,然后我使用相同的工具从xsd i创建了这个类。
我得到了这个问题:'对象不能存储在这种类型的数组中。 和' XML文档中存在错误(8,144)'。 在xml的那行中我得到了这个:
<events>
<event assist="" assistid="" extra_min="" id="21775794" minute="87" player="O. Atia" playerid="" result="[0 - 1]" team="away" type="goal"/>
</events>
这是生成的c#属性:
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("event", typeof(livescoreLeagueMatchEventsEvent), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public livescoreLeagueMatchEventsEvent[][] events {
get {
return this.eventsField;
}
set {
this.eventsField = value;
}
}
这是解析代码:
XmlSerializer deserializer = new XmlSerializer(typeof(T));
using (XmlReader reader = XmlReader.Create(path))
{
return (T)deserializer.Deserialize(reader);
}
这是生成的xsd:
<xs:element name="events" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="event" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="assist" type="xs:string" />
<xs:attribute name="assistid" type="xs:string" />
<xs:attribute name="extra_min" type="xs:string" />
<xs:attribute name="id" type="xs:string" />
<xs:attribute name="minute" type="xs:string" />
<xs:attribute name="player" type="xs:string" />
<xs:attribute name="playerid" type="xs:string" />
<xs:attribute name="result" type="xs:string" />
<xs:attribute name="team" type="xs:string" />
<xs:attribute name="type" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
我认为xsd工具正在创建正确的类结构,并认为它可以在没有任何代码更改的情况下工作。试图步入序列化器反序列化方法而没有任何成功......
答案 0 :(得分:1)
我刚刚修复了我的xsd,我认为这对于我的xml规范是不正确的。 我改变了事件&#39;容器元素是这样的
<xs:element name="events" minOccurs="0" maxOccurs="1">
..
</xs:element>
并且生成的类中的新属性是我需要的:
public livescoreLeagueMatchEvent[] events {
get {
return this.eventsField;
}
set {
this.eventsField = value;
}
}
答案 1 :(得分:0)
应该像看到你向我们展示的示例代码一样简单......
[Serializable]
public class MyClass
{
[XmlArrayItem("event", IsNullable = false)]
public LivescoreLeagueMatchEventsEvent[] events { get; set; }
}
答案 2 :(得分:0)
您遇到xsd.exe中的已知错误:
http://webservices20.blogspot.de/2010/02/net-wcf-bug-cannot-convert-type-to.html
使用以下解决方法之一:
编辑生成的代理类 - 删除一次[]
。
通过在<xs:element minOccurs="0" name="dummy" type="xs:string"/>
元素定义下添加虚拟元素event
来编辑XSD。