简体   繁体   中英

Deserializing this xml file

I'm trying to deserialize a file with the following contents, and getting an error:

<?xml version="1.0" encoding="utf-8"?>
<RootNode>
    <Collection>
         <Array1>
            <Array1Item Id="0"/>
         </Array1>
        <Array2>
            <Array2Item Id="7" Attribute="1" />
            <Array2Item Id="4" Attribute="2" />
            <Array2Item Id="16" Attribute="3" />
        </Array2>
    </Collection>
    <Collection>
         <Array1>
            <Array1Item Id="398"/>
         </Array1>
        <Array2>
            <Array2Item Id="7" Attribute="1" />
            <Array2Item Id="25" Attribute="2" />
            <Array2Item Id="27" Attribute="3" />
            <Array2Item Id="4" Attribute="4" />
            <Array2Item Id="10" Attribute="5" />
            <Array2Item Id="24" Attribute="6" />
            <Array2Item Id="26" Attribute="7" />
            <Array2Item Id="30" Attribute="8" />
            <Array2Item Id="31" Attribute="9" />
        </Array2>
    </Collection>
    <Collection>
        <Array1>
            <Array1Item Id="406"/>
         </Array1>
        <Array2>
            <Array2Item Id="7" Attribute="1" />
            <Array2Item Id="25" Attribute="2" />
            <Array2Item Id="27" Attribute="3" />
            <Array2Item Id="4" Attribute="4" />
            <Array2Item Id="10" Attribute="5" />
            <Array2Item Id="24" Attribute="6" />
            <Array2Item Id="26" Attribute="7" />
            <Array2Item Id="30" Attribute="8" />
            <Array2Item Id="31" Attribute="9" />
        </Array2>
    </Collection>
        <Collection>
                <Array1>
                    <Array1Item Id="2479"/>
                </Array1>
                <Array2>
                        <Array2Item Id="7" Attribute="1" />
                        <Array2Item Id="25" Attribute="2" />
                        <Array2Item Id="27" Attribute="3" />
                        <Array2Item Id="30" Attribute="4" />
                        <Array2Item Id="4" Attribute="5" />
                        <Array2Item Id="10" Attribute="6" />
                        <Array2Item Id="26" Attribute="7" />
                </Array2>
        </Collection>
        <Collection>
        <Array1>
            <Array1Item Id="742"/>
            <Array1Item Id="767"/>
                    <Array1Item Id="768"/>
                    <Array1Item Id="773"/>
                    <Array1Item Id="774"/>
                    <Array1Item Id="775"/>
                    <Array1Item Id="776"/>
                    <Array1Item Id="779"/>
                    <Array1Item Id="822"/>
                    <Array1Item Id="899"/>
                    <Array1Item Id="904"/>
                    <Array1Item Id="947"/>
                    <Array1Item Id="948"/>
                    <Array1Item Id="952"/>
                    <Array1Item Id="953"/>
                    <Array1Item Id="1021"/>
                    <Array1Item Id="1036"/>
                    <Array1Item Id="1085"/>
                    <Array1Item Id="1086"/>
                    <Array1Item Id="1087"/>
                    <Array1Item Id="1145"/>
                    <Array1Item Id="1146"/>
                    <Array1Item Id="1147"/>
                    <Array1Item Id="1148"/>
                    <Array1Item Id="1149"/>
                    <Array1Item Id="1151"/>
                    <Array1Item Id="1173"/>
                    <Array1Item Id="1194"/>
                    <Array1Item Id="1209"/>
                    <Array1Item Id="1213"/>
                    <Array1Item Id="1236"/>
                    <Array1Item Id="1243"/>
                    <Array1Item Id="1244"/>
                    <Array1Item Id="1248"/>
                    <Array1Item Id="1303"/>
                    <Array1Item Id="1399"/>
                    <Array1Item Id="1587"/>
                    <Array1Item Id="1589"/>
                    <Array1Item Id="1639"/>
                    <Array1Item Id="1655"/>
                    <Array1Item Id="1688"/>
                    <Array1Item Id="1708"/>
                    <Array1Item Id="1709"/>
                    <Array1Item Id="1713"/>
                    <Array1Item Id="1714"/>
                    <Array1Item Id="1735"/>
                    <Array1Item Id="1798"/>
                    <Array1Item Id="1814"/>
                    <Array1Item Id="1929"/>
                    <Array1Item Id="1944"/>
                    <Array1Item Id="1969"/>
                    <Array1Item Id="2034"/>
                    <Array1Item Id="2038"/>
                    <Array1Item Id="2059"/>
                    <Array1Item Id="2191"/>
                    <Array1Item Id="2362"/>
                    <Array1Item Id="2501"/>
                    <Array1Item Id="2980"/>
                    <Array1Item Id="2981"/>
                    <Array1Item Id="2982"/>
                    <Array1Item Id="2984"/>
                    <Array1Item Id="2985"/>
                    <Array1Item Id="3045"/>
                    <Array1Item Id="3047"/>
                    <Array1Item Id="3053"/>
                    <Array1Item Id="3054"/>
                    <Array1Item Id="3055"/>
                    <Array1Item Id="3149"/>
                    <Array1Item Id="3219"/>
                    <Array1Item Id="3220"/>
                    <Array1Item Id="3234"/>
                    <Array1Item Id="3288"/>
         </Array1>
                <Array2>
                        <Array2Item Id="7" Attribute="1" />
                </Array2>
        </Collection>
        <Collection>
            <Array1>
                    <Array1Item Id="2120"/>
                    <Array1Item Id="2125"/>
                    <Array1Item Id="2173"/>
                    <Array1Item Id="2534"/>
                    <Array1Item Id="2574"/>
                    <Array1Item Id="2575"/>
                    <Array1Item Id="2576"/>
                    <Array1Item Id="2577"/>
                    <Array1Item Id="2721"/>
             </Array1>          
                <Array2>
                        <Array2Item Id="7" Attribute="1" />
                </Array2>
        </Collection>
    <Collection>
         <Array1>
            <Array1Item Id="2299"/>
            <Array1Item Id="2366"/>
            <Array1Item Id="2464"/> 
            <Array1Item Id="2466"/>
            <Array1Item Id="2465"/>
            <Array1Item Id="2467"/>
         </Array1>
        <Array2>
            <Array2Item Id="7" Attribute="1" />
        </Array2>
    </Collection>
</RootNode>

Here's the method I'm using to deserialize that file:

    protected virtual List<Collection> Deserialize()
    {
        List<Collection> data = new List<Collection>();
        try
        {
            using (var reader = new StreamReader(Path))
            {
                var xmlSerializer = new XmlSerializer(typeof(List<Collection>));
                data = (List<Collection>)xmlSerializer.Deserialize(reader);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        return data;
    }
}

I'm getting the Exception: "There is an error in XML document (2, 2)." on the line with Deserialize(reader)

Here's the collection:

[Serializable,
     GeneratedCode("xsd", "2.0.50727.3038"),
     DesignerCategory("code"),
     DebuggerStepThrough,
     XmlType(AnonymousType = true)]
    public class Collection
    {
        public Collection()
        {
            Array1 = new Array1[0];
            Array2 = new Array2[0];
        }

        [XmlArrayItem("Array1")]
        public Array1Item[] Array1{ get; set; }

        [XmlArrayItem("Array2 ", IsNullable = true)]
        public Array2Item[] Array2 { get; set; }
    }

What's wrong?

The deserialization is failing because of the presence of the <RootNode> element. The deserializer doesn't expect this element; it expects a bunch <Collection> elements.

Instead, try deserializing from the top level, using a class like this

[XmlRootAttribute("RootNode")]
public class RootNode
{
    [XmlElement("Collection")]
    public Collection[] CollectionBag { get; set; }
}

And changing the deserialization to

var xmlSerializer = new XmlSerializer(typeof(RootNode));
data = ((RootNode)xmlSerializer.Deserialize(reader)).CollectionBag;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM