Krzysztof Lichwiarz
Krzysztof Lichwiarz

Reputation: 97

XML error during deserialize

I have problem when I'm trying to deserialize an XML to object. My XML look like:

<?xml version="1.0" encoding="utf-16"?>
<Products
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <AllProducts>
        <Product>
            <ID>8</ID>
            <GID>51280</GID>
            <Kod>RNIKAKC1.6</Kod>
            <Name>SB-800</Name>
            <Ean>0018208048014</Ean>
            <CommodityGroup>
                <ID>86</ID>
                <Name>AKCESORIA FOTO</Name>
                <Path>
                    <Category>
                        <ID>60798</ID>
                        <Name>ARCHIWALNE</Name>
                    </Category>
                </Path>
            </CommodityGroup>
         </Product>
....
Next products
...

My method code:

var MemoryStream = APIAccess.DownloadFileToStream("example.xml", "exampleContainer");
            using (MemoryStream)
            {
                MemoryStream.Position = 0;
                using (StreamReader StreamReader = new StreamReader(MemoryStream))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(CommodityGroup));
                    var products = serializer.Deserialize(StreamReader);
                }
            }

Method DownloadFileToStream is working good, because it is useful in other classes.

I'm geting error:

InvalidOperationException: Products xmlns='' was not expected.

I want to create object of a Node CommodityGroup. I've created class selecting this node, coping it and pasting in the new class like Paste Special -> XML

Attributes of this class looks like:

[Serializable()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(AnonymousType = true)]
[XmlRootAttribute(Namespace = "CommodityGroup", IsNullable = false)]

I don't know to fix it. When I'm adding into XML Serializer param new XmlRootAttribute("Products"), I'm getting "0" values.

Do you have any suggestions?

Upvotes: 1

Views: 203

Answers (1)

Alexander Petrov
Alexander Petrov

Reputation: 14251

If you want to deserialize only part of an xml document, you should skip unnecessary nodes.

Do it using XmlReader.

using (StreamReader StreamReader = new StreamReader(MemoryStream))
using (var xmlReader = XmlReader.Create(StreamReader))
{
    xmlReader.ReadToFollowing("CommodityGroup");
    XmlSerializer serializer = new XmlSerializer(typeof(CommodityGroup));
    var commodityGroup = (CommodityGroup)serializer.Deserialize(xmlReader);
}

Upvotes: 2

Related Questions