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

Deserializing XML attribute 'xsi:type'

这是我第一次在 Whosebug 上提问,也是第一次使用 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="";

}

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

请试试这个:

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