2015-08-02 5 views
1

Это мой первый запрос на stackoverflow, а также первый раз для работы с xml-файлами, поэтому я не думаю, что это может ухудшиться. мне нужно десериализации некоторые длинные XML, но часть Thats подслушивания меня заключается в следующем:Deserializing XML-атрибут 'xsi: type'

<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 
 
      \t 1. DigitalChanelToWatch: This is the digital Input channel to monitor      edges on it. 
 
      \t 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=""; 

} 

Я знаю, что Everthing так грязно, но я не мог сделать лучше: /.

+0

Что конкретно это проблема? Вы можете использовать инструмент XSD.exe, поставляемый с инфраструктурой .net, для создания классов C# из файла XML (https://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110). ASPX). – PhillipH

+0

D Вам действительно нужны интерфейсы и интерфейс? Что насчет «функций» и «функции». И «args» и «arg». Изменение XmlArrayItem на XmlElement удаляет эти повторяющиеся теги. – jdweng

+0

@jdweng Да, они мне нужны, потому что это не полный xml-файл, полный xml-файл имеет много интерфейсов, функций и аргументов, поэтому я думаю, что мне это нужно. –

ответ

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

Я не знаю, сколько существует раз интерфейс и функциональные элементы. Поэтому я создал коллекцию List.

+0

Это работало нормально. Если вы можете объяснить, почему это должно быть так? Является ли «xsi: type» вроде ключевого слова или специального атрибута, который я не могу просто получить, как другие? –

+0

Класс 'XmlSerializer' использует атрибут' xsi: type', чтобы определить, какой тип объекта десериализуется из элемента экземпляра XML, содержащего этот атрибут. Тип должен присутствовать в иерархии деривации. (Префикс xsi используется для пространства имен экземпляров XML Schema, http://www.w3.org/2001/XMLSchema-instance и применяется к документам экземпляра XML, предназначенным для соответствия указанным схемам XML.) Также см. [Здесь] (здесь) https://msdn.microsoft.com/en-us/library/2baksw0z%28v=vs.110%29.aspx). –

Смежные вопросы