Error in deserializing the XML data in C#

2019-08-27 23:02发布

I have a SVG file in XML format i am trying to deserialize XML to C# objects but when trying to deserialize XML data it is giving error

Below is my code

XmlSerializer serializer = new XmlSerializer(typeof(List<rootobject>));
object objectList = null;
using (StreamReader stream = new StreamReader(@"C:\Users\sana-user\Documents\Visual Studio 
      2015\Projects\SVGXMLToJsonApp\SVGXMLToJsonApp\File\3rect.svg"))
{
      objectList = serializer.Deserialize(stream);
}
 Console.WriteLine(objectList);

Below is my class

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/svg")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.w3.org/2000/svg", IsNullable = false)]
public partial class svg
{

    private svgStyle styleField;

    private svgG[] gField;

    private string[] textField;

    private decimal versionField;

    private string idField;

    private string xField;

    private string yField;

    private string viewBoxField;

    private string style1Field;

    private string spaceField;

    public svgStyle style
    {
        get
        {
            return this.styleField;
        }
        set
        {
            this.styleField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute("g")]
    public svgG[] g
    {
        get
        {
            return this.gField;
        }
        set
        {
            this.gField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string[] Text
    {
        get
        {
            return this.textField;
        }
        set
        {
            this.textField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal version
    {
        get
        {
            return this.versionField;
        }
        set
        {
            this.versionField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string x
    {
        get
        {
            return this.xField;
        }
        set
        {
            this.xField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string y
    {
        get
        {
            return this.yField;
        }
        set
        {
            this.yField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string viewBox
    {
        get
        {
            return this.viewBoxField;
        }
        set
        {
            this.viewBoxField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute("style")]
    public string style1
    {
        get
        {
            return this.style1Field;
        }
        set
        {
            this.style1Field = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/XML/1998/namespace")]
    public string space
    {
        get
        {
            return this.spaceField;
        }
        set
        {
            this.spaceField = value;
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/svg")]
public partial class svgStyle
{

    private string typeField;

    private string valueField;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/svg")]
public partial class svgG
{

    private svgGText textField;

    private svgGRect rectField;

    private string[] textField1;

    private string idField;

    public svgGText text
    {
        get
        {
            return this.textField;
        }
        set
        {
            this.textField = value;
        }
    }

    public svgGRect rect
    {
        get
        {
            return this.rectField;
        }
        set
        {
            this.rectField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string[] Text
    {
        get
        {
            return this.textField1;
        }
        set
        {
            this.textField1 = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/svg")]
public partial class svgGText
{

    private string idField;

    private string transformField;

    private string classField;

    private string valueField;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string transform
    {
        get
        {
            return this.transformField;
        }
        set
        {
            this.transformField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @class
    {
        get
        {
            return this.classField;
        }
        set
        {
            this.classField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/2000/svg")]
public partial class svgGRect
{

    private string idField;

    private decimal xField;

    private decimal yField;

    private string classField;

    private decimal widthField;

    private decimal heightField;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal x
    {
        get
        {
            return this.xField;
        }
        set
        {
            this.xField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal y
    {
        get
        {
            return this.yField;
        }
        set
        {
            this.yField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @class
    {
        get
        {
            return this.classField;
        }
        set
        {
            this.classField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal width
    {
        get
        {
            return this.widthField;
        }
        set
        {
            this.widthField = value;
        }
    }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal height
    {
        get
        {
            return this.heightField;
        }
        set
        {
            this.heightField = value;
        }
    }
}

Error is coming on line objectList = serializer.Deserialize(stream);

Error is {"http://www.w3.org/2000/svg'> was not expected."}

Below is my XML data

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="_x30_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 1366 768" style="enable-background:new 0 0 1366 768;" xml:space="preserve">
<style type="text/css">
	.st0{fill:none;stroke:#000000;stroke-width:0.7087;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
	.st1{fill:#105689;}
	.st2{font-family:'ArialMT';}
	.st3{font-size:56.5499px;}
	.st4{fill:#4554A5;}
	.st5{font-size:56.5574px;}
	.st6{fill:#2776BB;}
</style>
<g id="LWPOLYLINE">
	<rect id="idrect3" x="251.4" y="-0.3" class="st0" width="866" height="300.2"/>
</g>
<g id="LWPOLYLINE_1_">
	<rect id="idrect2" x="248.6" y="366.5" class="st0" width="500.3" height="400.2"/>
</g>
<g id="LWPOLYLINE_2_">
	<rect id="idrect1" x="811.4" y="364.2" class="st0" width="300.2" height="404.1"/>
</g>
<g id="TEXT">
	<text id="idnano" transform="matrix(1 0 0 1 515.7997 166.1773)" class="st1 st2 st3">Nano Tech</text>
</g>
<g id="TEXT_1_">
	<text id="idmigalo" transform="matrix(1 0 0 1 420.2463 553.5321)" class="st4 st2 st5">Migalo</text>
</g>
<g id="TEXT_2_">
	<text id="idprime" transform="matrix(1 0 0 1 883.9615 567.5667)" class="st6 st2 st5">Prime</text>
</g>
</svg>

Tried many things but i am not getting why this error is coming. Can anyone please help me out to solve this error. I am stuck with this error since a week an unable to solve it.

1条回答
贼婆χ
2楼-- · 2019-08-27 23:27

Now this is how I would solve this issue.

You will have to add your error handling and null checks of course. But this is as simple as I think you will ever get it thought not very fast.

private void ConvertXmlToClass()
{
    try
    {

        XDocument doc = XDocument.Load(@"c:\temp\del.xml");
        string jsonText = JsonConvert.SerializeXNode(doc);
        dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);

        dynamic svg = dyn.svg;
        var result = new Svg
        {
            g = new List<G>(),
            svgStyle = GetString(svg, "@style"),
            id = GetString(svg, "@id"),
            x = GetString(svg, "@x"),
            y = GetString(svg, "@y"),
            viewBox = GetString(svg, "@viewBox"),
            cssStyle = GetString(((IDictionary<string, object>)svg)["style"] as ExpandoObject, "#text"),
        };

        foreach (ExpandoObject gObj in svg.g)
        {
            var g = new G
            {
                Id = GetString(gObj, "@id"),
            };

            if (PropertyExist(gObj, "rect"))
            {
                var rect = ((IDictionary<string, object>)gObj)["rect"] as ExpandoObject;

                g.Rect = new Rect
                {
                    Class = GetString(rect, "@class"),
                    id = GetString(rect, "@id"),
                    height = GetString(rect, "@height"),
                    width = GetString(rect, "@width"),
                    x = GetString(rect, "@x"),
                    y = GetString(rect, "@y"),
                };
            }

            if (PropertyExist(gObj, "text"))
            {
                var txt = ((IDictionary<string, object>)gObj)["text"] as ExpandoObject;
                g.Text = new Text
                {
                    Class = GetString(txt, "@class"),
                    id = GetString(txt, "@id"),
                    TextData = GetString(txt, "#text"),
                    transform = GetString(txt, "@transform"),
                };
            }

            result.g.Add(g);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

private string GetString(ExpandoObject obj, string key)
{
    return ((IDictionary<string, object>)obj)[key] as string;
}

private bool PropertyExist(dynamic settings, string name)
{
    if (settings is ExpandoObject)
        return ((IDictionary<string, object>)settings).ContainsKey(name);

    return settings.GetType().GetProperty(name) != null;
}


private class Svg
{
    public string id { get; set; }
    public string x { get; set; }
    public string y { get; set; }
    public string viewBox { get; set; }
    public string cssStyle { get; set; }
    public string svgStyle { get; set; }
    public List<G> g { get; set; }
}


private class G
{
    public string Id { get; set; }
    public Rect Rect { get; set; }
    public Text Text { get; set; }
}

private class Text
{
    public string id { get; set; }
    public string transform { get; set; }
    public string Class { get; set; }
    public string TextData { get; set; }
}

private class Rect
{
    public string id { get; set; }
    public string x { get; set; }
    public string y { get; set; }
    public string Class { get; set; }
    public string width { get; set; }
    public string height { get; set; }
}

[Edit]

Now for some explanation of this code.

First we read the xml as XDocument that is LINQ to XML class and then covert that into Dynamic and its ExpandoObject using JsonConvert.

So now you have this nice ExpandoObject which in our usage here is an dictionary of keys and values. This we use in the GetString function to return the ExpandoObject value as string.

here is an short explanation of ExpandoObject and dynamic

查看更多
登录 后发表回答