简体   繁体   English

在C#中反序列化XML数据时出错

[英]Error in deserializing the XML data in C#

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 我有一个XML格式的SVG文件,我试图将XML反序列化为C#对象,但是当试图反序列化XML数据时,它给出了错误

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); 行上objectList = serializer.Deserialize(stream);错误objectList = serializer.Deserialize(stream);

Error is {"http://www.w3.org/2000/svg'> was not expected."} 错误是{“ http://www.w3.org/2000/svg'>不正确。”}

Below is my XML data 下面是我的XML数据

 <?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. 自一个星期以来,我一直无法解决此错误。

Now this is how I would solve this issue. 现在这就是我要解决的问题。

You will have to add your error handling and null checks of course. 当然,您将必须添加错误处理和null检查。 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. 首先,我们将xml读取为LINQ to XML类的XDocument,然后使用JsonConvert将其隐藏为Dynamic及其ExpandoObject。

So now you have this nice ExpandoObject which in our usage here is an dictionary of keys and values. 因此,现在您有了一个不错的ExpandoObject,在我们的用法中,这是键和值的字典。 This we use in the GetString function to return the ExpandoObject value as string. 我们在GetString函数中使用此函数以字符串形式返回ExpandoObject值。

here is an short explanation of ExpandoObject and dynamic 这是ExpandoObject和dynamic的简短说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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