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

时间:2015-08-02 13:54:01

标签: c# xml serialization deserialization

这是我第一次询问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>
&#13;
&#13;
&#13;

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="";

}

我知道everthing太乱了但我无法做得更好:/。

2 个答案:

答案 0 :(得分:1)

请试试这个:

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集合。

答案 1 :(得分:0)

之前的答案很好,并且帮助我解决了我的问题,但是我已经做了额外的工作来处理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
{
}