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

时间:2018-10-04 08:05:33

标签: c# xml-deserialization

我有一个XML格式的SVG文件,我试图将XML反序列化为C#对象,但是当试图反序列化XML数据时却出错了

下面是我的代码

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);

下面是我的课程

[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;
        }
    }
}

objectList = serializer.Deserialize(stream);行出现错误

错误为{“ http://www.w3.org/2000/svg'>不正确。”}

下面是我的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>

尝试了很多事情,但我不明白为什么会出现此错误。谁能帮我解决这个错误。由于一个星期无法解决此错误,因此我感到很困惑。

1 个答案:

答案 0 :(得分:0)

现在这就是我要解决的问题。

您当然必须添加错误处理和null检查。但这很简单,因为我认为您很快就会想到。

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; }
}

[编辑]

现在要对此代码进行一些解释。

首先,我们将xml读取为LINQ to XML类的XDocument,然后使用JsonConvert将其隐藏为Dynamic及其ExpandoObject。

因此,现在您有了一个不错的ExpandoObject,在我们的用法中,这是键和值的字典。我们在GetString函数中使用此函数以字符串形式返回ExpandoObject值。

这是ExpandoObject and dynamic

的简短说明