XMLSerializer 发现未知节点
XMLSerializer finds unknown nodes
我有一个 XML 文件,我想将其反序列化为 C# class。
XML 文件如下所示:
<?xml version="1.0" ?>
<Animation name="Scene1">
<Object name="Object1">
<Polygons>
<Polygon vert0="1" vert1="2" vert2="0"/>
<Polygon vert0="1" vert1="3" vert2="2"/>
</Polygons>
<Transform>
<Frame Idx="1">
<Location x="50.0" y="50.0" z="0.0"/>
<Rotation x="0.0" y="0.0" z="0.0"/>
<Scaling x="40.0" y="40.0" z="1.0"/>
</Frame>
<Frame Idx="60">
<Location x="500.0" y="220.0" z="0.0"/>
<Rotation x="0.0" y="0.0" z="0.0"/>
<Scaling x="40.0" y="40.0" z="1.0"/>
</Frame>
</Transform>
</Object>
</Animation>
对于 C# 类 我有以下内容来表示动画:
[Serializable]
public class Animation
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlArray("Object")]
public Object[] Objects { get; set; }
public static Animation AnimationFactory(string filename)
{
XmlSerializer serializer = new XmlSerializer(typeof(Animation));
serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
FileStream fs = new FileStream(filename, FileMode.Open);
return (Animation)serializer.Deserialize(fs);
}
private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Node: " + e.Name);
}
private static void serializer_UnknownAttribute
(object sender, XmlAttributeEventArgs e)
{
Console.WriteLine("Unknown Attribute: " + e.Attr.Name);
}
}
对于对象:
[Serializable]
public class Object
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("Polygons")]
public Polygons Polygons { get; set; }
[XmlElement("Transform")]
public Transform Transforms { get; set; }
}
对于变换:
[Serializable]
public class Transform
{
[XmlArray("Frame")]
public FrameTRS[] Frames { get; set; }
}
FrameTRS 看起来像这样:
[Serializable]
[XmlInclude(typeof(Frame))]
public class FrameTRS : Frame
{
[XmlElement]
public Location Location { get; set; }
[XmlElement]
public Rotation Rotation { get; set; }
[XmlElement]
public Scaling Scaling { get; set; }
}
[Serializable]
public class Frame
{
[XmlAttribute("Idx")]
public int Index;
}
而每个位置、缩放、旋转都源自:
[Serializable]
[XmlInclude(typeof(Coordinates))]
public class Rotation : Coordinates
{
}
[Serializable]
public class Coordinates
{
[XmlAttribute("x")]
public double X { get; set; }
[XmlAttribute("y")]
public double Y { get; set; }
[XmlAttribute("z")]
public double Z { get; set; }
}
对于我拥有的多边形:
[Serializable]
public class Polygons
{
[XmlArray("Polygon")]
public Polygon[] Polygon { get; set; }
}
[Serializable]
public class Polygon
{
[XmlAttribute("vert0")]
public int Vert0 { get; set; }
[XmlAttribute("vert1")]
public int Vert1 { get; set; }
[XmlAttribute("vert2")]
public int Vert2 { get; set; }
[XmlAttribute("vert3")]
public int Vert3 { get; set; }
}
当我调用 Animation.AnimationFactory("file")
时,我没有遇到异常,但返回的动画对象只有名称和一个空对象。
我在控制台中得到了这个输出,因为它无法识别节点:
未知节点:多边形
未知节点:变换
谁能帮帮我?谢谢!
我找到了解决方案,也许它会对某人有所帮助:
我将 XmlArray
属性更改为 XmlElement
属性,现在它可以正常工作了。
我有一个 XML 文件,我想将其反序列化为 C# class。
XML 文件如下所示:
<?xml version="1.0" ?>
<Animation name="Scene1">
<Object name="Object1">
<Polygons>
<Polygon vert0="1" vert1="2" vert2="0"/>
<Polygon vert0="1" vert1="3" vert2="2"/>
</Polygons>
<Transform>
<Frame Idx="1">
<Location x="50.0" y="50.0" z="0.0"/>
<Rotation x="0.0" y="0.0" z="0.0"/>
<Scaling x="40.0" y="40.0" z="1.0"/>
</Frame>
<Frame Idx="60">
<Location x="500.0" y="220.0" z="0.0"/>
<Rotation x="0.0" y="0.0" z="0.0"/>
<Scaling x="40.0" y="40.0" z="1.0"/>
</Frame>
</Transform>
</Object>
</Animation>
对于 C# 类 我有以下内容来表示动画:
[Serializable]
public class Animation
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlArray("Object")]
public Object[] Objects { get; set; }
public static Animation AnimationFactory(string filename)
{
XmlSerializer serializer = new XmlSerializer(typeof(Animation));
serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
FileStream fs = new FileStream(filename, FileMode.Open);
return (Animation)serializer.Deserialize(fs);
}
private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Node: " + e.Name);
}
private static void serializer_UnknownAttribute
(object sender, XmlAttributeEventArgs e)
{
Console.WriteLine("Unknown Attribute: " + e.Attr.Name);
}
}
对于对象:
[Serializable]
public class Object
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("Polygons")]
public Polygons Polygons { get; set; }
[XmlElement("Transform")]
public Transform Transforms { get; set; }
}
对于变换:
[Serializable]
public class Transform
{
[XmlArray("Frame")]
public FrameTRS[] Frames { get; set; }
}
FrameTRS 看起来像这样:
[Serializable]
[XmlInclude(typeof(Frame))]
public class FrameTRS : Frame
{
[XmlElement]
public Location Location { get; set; }
[XmlElement]
public Rotation Rotation { get; set; }
[XmlElement]
public Scaling Scaling { get; set; }
}
[Serializable]
public class Frame
{
[XmlAttribute("Idx")]
public int Index;
}
而每个位置、缩放、旋转都源自:
[Serializable]
[XmlInclude(typeof(Coordinates))]
public class Rotation : Coordinates
{
}
[Serializable]
public class Coordinates
{
[XmlAttribute("x")]
public double X { get; set; }
[XmlAttribute("y")]
public double Y { get; set; }
[XmlAttribute("z")]
public double Z { get; set; }
}
对于我拥有的多边形:
[Serializable]
public class Polygons
{
[XmlArray("Polygon")]
public Polygon[] Polygon { get; set; }
}
[Serializable]
public class Polygon
{
[XmlAttribute("vert0")]
public int Vert0 { get; set; }
[XmlAttribute("vert1")]
public int Vert1 { get; set; }
[XmlAttribute("vert2")]
public int Vert2 { get; set; }
[XmlAttribute("vert3")]
public int Vert3 { get; set; }
}
当我调用 Animation.AnimationFactory("file")
时,我没有遇到异常,但返回的动画对象只有名称和一个空对象。
我在控制台中得到了这个输出,因为它无法识别节点:
未知节点:多边形
未知节点:变换
谁能帮帮我?谢谢!
我找到了解决方案,也许它会对某人有所帮助:
我将 XmlArray
属性更改为 XmlElement
属性,现在它可以正常工作了。