【发布时间】:2018-02-24 19:03:57
【问题描述】:
当我尝试使用 XmlSerializer 类将我的 XML 文件反序列化为对象时遇到问题。
我的 XML 文件如下所示:
<fx:FIBEX xmlns:fx="http://www.asam.net/xml/fbx" xmlns:ho="http://www.asam.net/xml" xmlns:ethernet="http://www.asam.net/xml/fbx/ethernet" xmlns:it="http://www.asam.net/xml/fbx/it" xmlns:service="http://www.asam.net/xml/fbx/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="" VERSION="4.1.0">
<fx:ELEMENTS>
<fx:CLUSTERS>
<fx:CLUSTER xsi:type="ethernet:CLUSTER-TYPE" ID="ID_CLUSTER_MAIN_1">
<ho:SHORT-NAME>SomeIpDatabase</ho:SHORT-NAME>
<fx:SPEED>1000000000</fx:SPEED>
<fx:IS-HIGH-LOW-BIT-ORDER>false</fx:IS-HIGH-LOW-BIT-ORDER>
<fx:BIT-COUNTING-POLICY>SAWTOOTH</fx:BIT-COUNTING-POLICY>
<fx:PROTOCOL>ETHERNET</fx:PROTOCOL>
<fx:PHYSICAL>OABR</fx:PHYSICAL>
<fx:CHANNEL-REFS>
<fx:CHANNEL-REF ID-REF="ID_CHANNEL_SOME_IP_1" />
</fx:CHANNEL-REFS>
<fx:MAX-FRAME-LENGTH>1500</fx:MAX-FRAME-LENGTH>
<ethernet:MAC-MULTICAST-GROUPS>
<ethernet:MAC-MULTICAST-GROUP ID="ID_CLUSTER_MAIN_1_ID_MACMULTICASTGROUP_SD_1">
<ho:SHORT-NAME>SD</ho:SHORT-NAME>
<ethernet:MAC-MULTICAST-ADDRESS>01:00:5E:40:FF:FB</ethernet:MAC-MULTICAST-ADDRESS>
</ethernet:MAC-MULTICAST-GROUP>
<ethernet:MAC-MULTICAST-GROUP ID="ID_CLUSTER_MAIN_1_ID_MACMULTICASTGROUP_BROADCAST_1">
<ho:SHORT-NAME>BROADCAST</ho:SHORT-NAME>
<ethernet:MAC-MULTICAST-ADDRESS>FF:FF:FF:FF:FF:FF</ethernet:MAC-MULTICAST-ADDRESS>
</ethernet:MAC-MULTICAST-GROUP>
</ethernet:MAC-MULTICAST-GROUPS>
</fx:CLUSTER>
<!--Additional CLUSTER elements omitted-->
</fx:CLUSTERS>
</fx:ELEMENTS>
<!--PROJECT elements omitted-->
</fx:FIBEX>
当我现在尝试反序列化 XML 文件时,我收到以下错误:
System.InvalidOperationException: Error in XML-Dokument (11,5). ---> System.InvalidOperationException: The specified type was not recognized: Name='CLUSTER-TYPE', Namespace='http://www.asam.net/xml/fbx/ethernet', at <CLUSTER xmlns='http://www.asam.net/xml/fbx'>.
我的反序列化器类如下所示:
public static T DeserializeXMLFileToObject<T>(string XmlFilename)
{
T returnObject = default(T);
if (string.IsNullOrEmpty(XmlFilename)) return default(T);
try
{
StreamReader xmlStream = new StreamReader(XmlFilename);
XmlSerializer serializer = new XmlSerializer(typeof(T));
returnObject = (T)serializer.Deserialize(xmlStream);
}
catch (Exception ex)
{
Console.Write("{1} Es ist ein Fehler aufgetreten {0}", ex, DateTime.Now);
}
return returnObject;
}
应该包含 XML 文件的反序列化元素和属性的类如下所示:
[XmlRoot("FIBEX", Namespace = fxNameSpace)]
public class Fibextoobject
{
[XmlElement("PROJECT", Namespace = fxNameSpace)]
public Project project { get; set; }
[XmlElement("ELEMENTS", Namespace = fxNameSpace)]
public Elements elements { get; set; }
public class Project
{
[XmlAttribute("OID", Namespace = hoNameSpace)]
public string OID { get; set; }
[XmlAttribute("ID")]
public string ID { get; set; }
[XmlElement("SHORT-NAME", Namespace = hoNameSpace)]
public string shortname { get; set; }
[XmlElement("LONG-NAME", Namespace = hoNameSpace)]
public string longname { get; set; }
}
public class Elements
{
[XmlArray("CLUSTERS", Namespace = fxNameSpace)]
[XmlArrayItem("CLUSTER", Namespace = fxNameSpace)]
public List<Cluster> cluster { get; set; }
}
public class Cluster
{
[XmlAttribute("ID")]
public string ID { get; set; }
[XmlElement("SHORT-NAME", Namespace = hoNameSpace)]
public string shortname { get; set; }
[XmlElement("SPEED", Namespace = fxNameSpace)]
public string speed { get; set; }
}
}
如何使用 xsi:type 属性成功反序列化 XML 文件,值中包含冒号和连字符:xsi:type="ethernet:CLUSTER-TYPE"?
【问题讨论】:
-
fxNameSpace和hoNameSpace是什么? -
相关或重复:xsi:type attribute messing up C# XML deserialization。该答案是否提供了足够的信息?你是如何生成你的 c# 类的?手动,还是通过一些代码生成工具?
-
fxnamespace 和 honamespace 只是我用于 XML 中的命名空间的变量。
-
不,这个答案对我的类型没有帮助,看起来像这个 ethernet:CLUSTER-TYPE,我不能创建一个像这个字符串这样的类,因为它里面有特殊字符。所以我的问题是如何处理这种类型?我手动创建了这些类。
-
@Daniel - 很高兴minimal reproducible example 你的第一个问题。在 cmets 中,您可以使用
@加上帐户名称来回复特定评论员,请参阅How do comment @replies work?。早些时候,我认为您试图回复我,但我从未收到通知。
标签: c# xml deserialization xmlserializer