2014-05-12 6 views
-1

J'ai un fichier xml sous forme de chaîne. Disons que la chaîneComment désérialiser une structure imbriquée avec XmlSerializer

<?xml version='1.0' encoding='utf-8' ?> 
<parameter> 
    <name>max_amount</name> 
    <label>Max Amount</label> 
    <unit>Millions</unit> 
    <component> 
    <type>Combo</type> 
    <attributes> 
     <type>Integer</type> 
     <displayed>4</displayed> 
     <selected>0</selected> 
     <items> 
     <item>5</item> 
     <item>10</item> 
     <item>20</item> 
     <item>50</item> 
     </items> 
    </attributes> 
    </component > 
</parameter> 

J'ai réussi désérialisée et a obtenu son objet comme celui-ci:

[XmlRoot(ElementName = "parameter")] 
     public class Parameter 
     { 
      [XmlElement("name")] 
      public string Name { get; set; } 
      [XmlElement("label")] 
      public string Label { get; set; } 
      [XmlElement("unit")] 
      public string Unit { get; set; } 
      [XmlElement("component")] 
      public Component Component { get; set; } 
     } 



[XmlRoot(ElementName = "component")] 
    public class Component 
    { 
     [XmlElement("type")] 
     public string Type { get; set; } 
     [XmlElement("attributes")] 
     public Attributes Attributes { get; set; } 
    } 





[XmlRoot(ElementName = "attributes")] 
    public class Attributes 
    { 
     [XmlElement("type")] 
     public string Type { get; set; } 
     [XmlElement("displayed")] 
     public string Displayed { get; set; } 
     [XmlElement("selected")] 
     public string Selected { get; set; } 
     [XmlArray("items")] 
     [XmlArrayItem("item", typeof(string))] 
     public List<string> Items { get; set; } 

    } 

Et Ma classe principale est comme ça où je avoir accès à l'ensemble des éléments de xml:

XmlSerializer deserializer = new XmlSerializer(typeof(Parameter)); 
    XmlReader reader = XmlReader.Create(new StringReader(xmlstring)); 
    Parameter parameter = (Parameter)deserializer.Deserialize(reader); 
    foreach (var item in parameter.Component.Attributes.Items) 
    { 
     Debug.WriteLine(item); 

    } 
    Debug.WriteLine(parameter.Component.Type); 
    Debug.WriteLine(parameter.Name); 
    Debug.WriteLine(parameter.Label); 
    Debug.WriteLine(parameter.Unit); 

Jusqu'à ici, tout va bien, mais si xml est imbriqué et si j'ai xml comme ceci:

<parameter> 
.... 
.... 
.... 
</parameter> 
<parameter> 
.... 
.... 
.... 
</parameter> 

En détail: si ma chaîne XML est comme ceci:

<?xml version='1.0' encoding='utf-8' ?> 
<parameter> 
    <name>max_amount</name> 
    <label>Max Amount</label> 
    <unit>Millions</unit> 
    <component> 
    <type>Combo</type> 
    <attributes> 
     <type>Integer</type> 
     <displayed>4</displayed> 
     <selected>0</selected> 
     <items> 
     <item>5</item> 
     <item>10</item> 
     <item>20</item> 
     <item>50</item> 
     </items> 
    </attributes> 
    </component > 
</parameter> 
<parameter> 
    <name>max_amount_again</name> 
    <label>Max Amount_again</label> 
    <unit>Millions_again</unit> 
    <component> 
    <type>Combo</type> 
    <attributes> 
     <type>Integer</type> 
     <displayed>41</displayed> 
     <selected>01</selected> 
     <items> 
     <item>50</item> 
     <item>100</item> 
     <item>200</item> 
     <item>500</item> 
     </items> 
    </attributes> 
    </component > 
</parameter> 

Comment puis-je obtenir l'élément cette fois-ci? car ici le paramètre est la classe "parent" et quand nous le désérialisons en faisant cela " Parameter parameter = (Parameter)deserializer.Deserialize(reader);" nous obtiendrons un objet de parameter et comment j'accéderai au second <parameter>..</parameter><parameter>..How to get the data here..</parameter>?

+2

Vous essayez d'obtenir une liste de paramètres? 'Liste '? – merp

+3

Eh bien tout d'abord que le second n'est pas un document XML valide, donc je suppose que vous ne désérialiserez pas quelque chose comme ça. –

+1

Vous avez 2 éléments XML root - ce n'est pas autorisé. Mettez le 2 '' dans un seul '' pour pouvoir l'analyser. –

Répondre

1

Si votre document XML ressemblera à ceci (ce qui est un document XML valide):

<?xml version='1.0' encoding='utf-8' ?> 
<parameters> 
    <parameter> 
    <name>max_amount</name> 
    <label>Max Amount</label> 
    <unit>Millions</unit> 
    <component> 
     <type>Combo</type> 
     <attributes> 
     <type>Integer</type> 
     <displayed>4</displayed> 
     <selected>0</selected> 
     <items> 
      <item>5</item> 
      <item>10</item> 
      <item>20</item> 
      <item>50</item> 
     </items> 
     </attributes> 
    </component > 
    </parameter> 
    <parameter> 
    <name>max_amount_again</name> 
    <label>Max Amount_again</label> 
    <unit>Millions_again</unit> 
    <component> 
     <type>Combo</type> 
     <attributes> 
     <type>Integer</type> 
     <displayed>41</displayed> 
     <selected>01</selected> 
     <items> 
      <item>50</item> 
      <item>100</item> 
      <item>200</item> 
      <item>500</item> 
     </items> 
     </attributes> 
    </component > 
    </parameter> 
</parameters> 

Vous aurez besoin une autre classe pour stocker tous les éléments <parameter>...</parameter>

public class Parameters 
{ 
    [XmlElement("parameter")] 
    public List<Parameter> parameterList = new List<Parameter>();   
} 

Et désérialiser ce document en cette classe.

XmlSerializer deserializer = new XmlSerializer(typeof(Parameters)); 
using (TextReader reader = new StreamReader(@"C:\path\to\your\xml")) 
{ 
    object obj = deserializer.Deserialize(reader); 
    Parameters deserialized = (Parameters)obj; 
} 

Pour accéder à ces éléments parameter vous pouvez simplement utiliser la boucle foreach .: par exemple

Parameters p = new Parameters(); 

foreach (Parameter parameter in p.parameterList) 
{ 
    Console.WriteLine(parameter.Name); 
} 
+0

Pourriez-vous s'il vous plaît également me dire que comment j'accéderai à l'élément de la classe de paramètre je veux dire quelque chose comme "Debug.WriteLine (parameter.Name);" qui contient "max_amount" et "Debug.WriteLine (parameter.Name);" qui contient "max_amount_gain"? – Sss

+0

@ user234839 J'ai modifié la réponse. –

+0

maintenant. montrera-t-il à la fois max_amount et max_amount_again? sur le débogage? – Sss

Questions connexes