繁体   English   中英

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

[英]Deserializing XML attribute 'xsi:type'

这是我第一次询问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="";

}

我知道一切都那么混乱,但我无法做得更好:/。

请尝试以下方法:

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

我不知道接口和功能元素存在多少次。 所以我做了列表集合。

上一个答案是一个很好的答案,它帮助我解决了问题,但是我还有很多工作来处理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
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM