.NET中的XML反序列化错误

时间:2015-04-11 15:11:29

标签: c# .net xml xml-deserialization

我在尝试将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工具正在创建正确的类结构,并认为它可以在没有任何代码更改的情况下工作。试图步入序列化器反序列化方法而没有任何成功......

3 个答案:

答案 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。