irldev
irldev

Reputation: 409

There is an error in XML document C# Xamarin

I am getting the following error in my Xamarin Forms app but I don't know what the problem is:

System.InvalidOperationException: There is an error in XML document. items xmlns=''> was not expected

I have a basic XML file that I have added as an embedded resource:

<?xml version="1.0" encoding="UTF-8"?>
  <items>
    <item>
        <id>1</id>
        <name>a name</name>
        <address>an address</address>
        <postcode>a postcode</postcode>
    </item>
    <item>
        <id>2</id>
        <name>name 2</name>
        <address>address 2</address>
        <postcode>postcode 2</postcode>
    </item>
    <item>
        <id>3</id>
        <name>name 3</name>
        <address>address 3</address>
        <postcode>postcode 3</postcode>
    </item>
</items>

I have the following method to read the XML file:

    public static List<Item> GetItemList()
    {
        var assembly = typeof(MyNewPage).GetTypeInfo().Assembly;
        Stream stream = assembly.GetManifestResourceStream("MyNewApp.allitems.xml");

        List<Item> itemsFullList;

        using (var reader = new System.IO.StreamReader(stream))
        {
            var serializer = new XmlSerializer(typeof(List<Item>));
            itemsFullList = (List<Item>)serializer.Deserialize(reader);
        }

        return itemsFullList;
    }

I also have a standard class to represent each item:

public class Item
{
    public Item()
    {
    }

    public string name { get; set; }
    public string address { get; set; }
    public string postcode { get; set; }

}

I don't know why I am getting the error as from what I can see, the XML document is formatted just fine. I am using this article as a guide but I am having no luck: https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/files/

Anyone know what I am doing wrong here?

Thanks.

Upvotes: 0

Views: 630

Answers (1)

Crowcoder
Crowcoder

Reputation: 11514

That class structure will not deserialize to a list of Item, it will deserialize to a single object that has a property of type Item[].

You will probably want to change class and property names to make more sense, but this is how Visual Studio generates the class structure based on your xml (Edit > Paste Special)

void Main()
{
    string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
  <items>
    <item>
        <id>1</id>
        <name>a name</name>
        <address>an address</address>
        <postcode>a postcode</postcode>
    </item>
    <item>
        <id>2</id>
        <name>name 2</name>
        <address>address 2</address>
        <postcode>postcode 2</postcode>
    </item>
    <item>
        <id>3</id>
        <name>name 3</name>
        <address>address 3</address>
        <postcode>postcode 3</postcode>
    </item>
</items>";

    using (MemoryStream ms = new MemoryStream())
    {
        XDocument.Parse(xml).Save(ms);
        ms.Position = 0;
        using (var reader = new System.IO.StreamReader(ms))
        {
            var serializer = new XmlSerializer(typeof(items));
            var itemsFullList = (items)serializer.Deserialize(reader);
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(ElementName = "items", Namespace = "", IsNullable = false)]
public partial class items
{

    private itemsItem[] itemField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("item")]
    public itemsItem[] item
    {
        get
        {
            return this.itemField;
        }
        set
        {
            this.itemField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class itemsItem
{

    private byte idField;

    private string nameField;

    private string addressField;

    private string postcodeField;

    /// <remarks/>
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    public string name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }

    /// <remarks/>
    public string address
    {
        get
        {
            return this.addressField;
        }
        set
        {
            this.addressField = value;
        }
    }

    /// <remarks/>
    public string postcode
    {
        get
        {
            return this.postcodeField;
        }
        set
        {
            this.postcodeField = value;
        }
    }
}

Upvotes: 1

Related Questions