【问题标题】:deserialization error : "<book xmlns=''> was not expected." DeSerialize from xml string反序列化错误:“<book xmlns=''> 不是预期的。”从 xml 字符串反序列化
【发布时间】:2012-03-19 17:03:33
【问题描述】:

我在将 xml 反序列化为多个类对象时遇到问题。当我尝试你反序列化 我得到“不是预期的”。

这是我的调用代码

StringReader strReader = new StringReader(xml);          
XmlTextReader reader = new XmlTextReader(strReader);
reader.ReadToDescendant("book");
var temp = DeserializeFromXml<book>(reader.ReadOuterXml());

public static T DeserializeFromXml<T>(string xml)
    {
        T result;
        XmlRootAttribute xRoot = new XmlRootAttribute();
        XmlSerializer ser = new XmlSerializer(typeof(T));
        using (TextReader tr = new StringReader(xml))
        {
            result = (T)ser.Deserialize(tr);
        }
        return result;
    }

xml 是字符串消息

<?xml version="1.0" encoding="UTF-8"?><books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<book genre="novel">
    <title>The Handmaid's Tale</title>
    <price>19.95</price>
    <ISBN>1-861003-78</ISBN>
    <style>hardcover</style>
</book>
<library genre="novel">
    <name>Oxford</name>
    <location>london</location>
    <ISBN>1-8888888-88</ISBN>
    <address>12th main, chesmedia</address>
</library>

当我尝试执行这段代码时,我得到了这个内部异常“不是预期的”。

这是我的课程代码

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/SampleBooks.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/SampleBooks.xsd", IsNullable = false)]
public partial class books
{

    private book bookField;

    private library libraryField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    public books()
    {
        this.libraryField = new library();
        this.bookField = new book();
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 0)]
    public book book
    {
        get
        {
            return this.bookField;
        }
        set
        {
            this.bookField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
    public library library
    {
        get
        {
            return this.libraryField;
        }
        set
        {
            this.libraryField = value;
        }
    }

    private static System.Xml.Serialization.XmlSerializer Serializer
    {
        get
        {
            if ((serializer == null))
            {
                serializer = new System.Xml.Serialization.XmlSerializer(typeof(books));
            }
            return serializer;
        }
    }

}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/SampleBooks.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/SampleBooks.xsd", IsNullable = false)]
public partial class book
{

    private title titleField;

    private decimal priceField;

    private ISBN iSBNField;

    private style styleField;

    private bookGenre genreField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    [System.Xml.Serialization.XmlElementAttribute(Order = 0)]
    public title title
    {
        get
        {
            return this.titleField;
        }
        set
        {
            this.titleField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
    public decimal price
    {
        get
        {
            return this.priceField;
        }
        set
        {
            this.priceField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 2)]
    public ISBN ISBN
    {
        get
        {
            return this.iSBNField;
        }
        set
        {
            this.iSBNField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order = 3)]
    public style style
    {
        get
        {
            return this.styleField;
        }
        set
        {
            this.styleField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bookGenre genre
    {
        get
        {
            return this.genreField;
        }
        set
        {
            this.genreField = value;
        }
    }

    private static System.Xml.Serialization.XmlSerializer Serializer
    {
        get
        {
            if ((serializer == null))
            {
                serializer = new System.Xml.Serialization.XmlSerializer(typeof(book));
            }
            return serializer;
        }
    }

}

【问题讨论】:

    标签: asp.net c#-4.0 xml-serialization xsd xml-parsing


    【解决方案1】:

    只需从 Book 类的属性中去掉 Namespace =。 所以你的代码会像

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
        [System.SerializableAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/SampleBooks.xsd")]
        [System.Xml.Serialization.XmlRootAttribute(IsNullable = false)]
        public partial class book
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多