反序列化XML属性'xsi:type'

本文关键字:type xsi XML 反序列化 属性 | 更新日期: 2023-09-27 18:06:01

这是我第一次在stackoverflow上提问,也是第一次使用xml文件,所以我认为它不会比这更糟糕。我需要反序列化一些很长的XML,但困扰我的部分是:

<CastleConfigSub xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/c5c.xsd" Format="1">
  <ConfigFile Name="EdgeDetection">
    <Interfaces>
      <Interface Name="EdgeDetectionModule">
        <Doc />
         <Functions>
          <Function Name="MonitorNoChanges">
            <Doc>This Function checks that no edge has been detected at the specified                    digital channel for a specific time in msec
            	1. DigitalChanelToWatch: This is the digital Input channel to monitor                      edges on it.
            	2. TimeOut: This is the monitoring Period for the edges on the digitial                    input channel.
            </Doc>
            <Args>
              <Arg xsi:type="ArgEnum" Name="DigitalChanelToWatch"                                      Enum="DigitalInChannelID" />
              <Arg xsi:type="ArgValue" Name="TimeOut" EncodedType="uint32"                               Unit="msec" />
            </Args>
           </Function>
          </Functions>
        </Interface>
      </Interfaces>
    </ConfigFile>
  </CastleConfigSub>

public class CastleConfigSub
{
    [XmlElement("Options")]
    public Options options = new Options();
    [XmlElement("ConfigFile")]
    public ConfigFile configFile= new ConfigFile();

} 
public class ConfigFile
{
    [XmlElement("Doc")]
    public string doc {get; set;} 
    [XmlElement("History")]
    public History history = new History();
    [XmlElement("Includes")]
    public Includes includes = new Includes();
    [XmlElement("Options")]
    public Options options = new Options();
    [XmlElement("DataTypes")]
    public DataTypes dataTypes = new DataTypes();
    [XmlArray("Interfaces")]
    [XmlArrayItem("Interface")]
    public List<Interface> interfaces = new List<Interface>();

}
 public class Interface
{
    [XmlAttribute("Name")]
    public string name="";
    [XmlElement("Doc")]
    [XmlArray("Functions")]
    [XmlArrayItem("Function")]
    public List<Function> functions = new List<Function>();
}
public class Function
{
    [XmlAttribute("Name")]
    public string name="";
    [XmlElement("Doc")]
    public string doc="";
    [XmlArray("Args")]
    [XmlArrayItem("Arg")]
    public List<Arg> args = new List<Arg>();
}
public class Arg
{
    [XmlAttribute ("xsi:type")]
    public string type = "";
    [XmlAttribute("Name")]
    public string name ="";
    [XmlAttribute("EncodedType")]
    public string encodedType="";
    [XmlAttribute("Enum")]
    public string enumName ="";
    [XmlAttribute("Unit")]
    public string unit="";
}

我知道一切都很乱,但我不能做得更好:/.

反序列化XML属性'xsi:type'

请试试:

public class CastleConfigSub
{
    public ConfigFile ConfigFile { get; set; }
    [XmlAttribute()]
    public byte Format { get; set; }
}
public class ConfigFile
{
    public List<Interface> Interfaces { get; set; }
    [XmlAttribute()]
    public string Name { get; set; }
}
public class Interface
{
    public object Doc { get; set; }
    public List<Function> Functions { get; set; }
    [XmlAttribute()]
    public string Name { get; set; }
}
public class Function
{
    public string Doc { get; set; }
    [XmlArrayItem("Arg")]
    public List<Arg> Args { get; set; }
    [XmlAttribute()]
    public string Name { get; set; }
}
[XmlInclude(typeof(ArgEnum))]
[XmlInclude(typeof(ArgValue))]
public class Arg
{
    [XmlAttribute()]
    public string Name { get; set; }
}
public class ArgEnum : Arg
{
    [XmlAttribute()]
    public string Enum { get; set; }
}
public class ArgValue : Arg
{
    [XmlAttribute()]
    public string EncodedType { get; set; }
    [XmlAttribute()]
    public string Unit { get; set; }
}

我不知道Interface和Function元素存在了多少次。所以我创建了List集合

前面的答案是一个很好的,并帮助我解决了我的问题,但我有额外的工作来处理不同的名称空间在xml元素和它的属性值,所以我的解决方案是在这里:

有以下xml

<?xml version="1.0" encoding="utf-16"?>
<RootType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://my.custom.namespace.com">
  <description>some description</description>
  <values>
    <field>some field</field>
    <value xsi:type="xsd:double">1000.00</value>
  </values>
</RootType>

反序列化对象集如下

[XmlRoot(ElementName = "RootType", Namespace = "http://my.custom.namespace.com")]
public sealed class Root
{
    [XmlElement("description")]
    public string Description { get; set; }
    [XmlElement("values")]
    public Value[] Values { get; set; }
}
public sealed class Value
{
    [XmlElement("field")]
    public string Field { get; set; }
    [XmlElement("value", IsNullable = true)]
    public ValueProperty ValueProperty { get; set; }
}
[XmlInclude(typeof(CustomDouble))]
[XmlRoot(Namespace = "http://my.custom.namespace.com")]
public class ValueProperty
{
    [XmlText]
    public string Value { get; set; }
}
[XmlType(TypeName = "double", Namespace = "http://www.w3.org/2001/XMLSchema")]
public class CustomDouble : ValueProperty
{
}