2014-05-12 4 views
-1

У меня есть xml в строковой форме. Допустим, снабжать струной, тетивой и т.п.Как десериализовать вложенную структуру с помощью 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> 

Я успешно десериализации и получил его объект, как это:

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

    } 

И мой главный класс, как это, где я получить доступ к все элементы 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); 

До тех пор, пока здесь не все нормально, но что, если xml вложен, и если у меня есть xml вот так:

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

Более подробно: если мой XML-строка выглядит так:

<?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> 

Как я получит элемент на этот раз?, потому что здесь параметр является «родительским» классом, и когда мы десериализируем его, делаем это " Parameter parameter = (Parameter)deserializer.Deserialize(reader);", мы получим объект parameter и как я получу второй код <parameter>..</parameter><parameter>..How to get the data here..</parameter>?

+2

Таким образом, вы пытаетесь получить список параметров? 'Список '? – merp

+3

Ну, во-первых, этот второй не является допустимым XML-документом, поэтому, я думаю, вы не будете десериализовать что-то подобное. –

+1

У вас есть два корневых элемента XML - это недопустимо. Поместите 2 '' в один '', чтобы иметь возможность его разобрать. –

ответ

1

Если ваш XML-документ будет выглядеть следующим образом (что является допустимым XML-документ):

<?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> 

Вам понадобится еще один класс для хранения всех элементов <parameter>...</parameter>

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

И десериализация этого документа в этот класс.

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

Чтобы получить доступ к этим parameter элементы вы можете просто использовать цикл по каждому элементу т.д .:

Parameters p = new Parameters(); 

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

Не могли бы вы также сказать мне, что как я могу получить доступ к элементу класса параметров, я имею в виду что-то вроде «Debug.WriteLine (parameter.Name)»; который содержит «max_amount» и «Debug.WriteLine (parameter.Name)»; который содержит «max_amount_gain»? – Sss

+0

@ user234839 Я отредактировал ответ. –

+0

сейчас. будет ли отображаться как max_amount, так и max_amount_again? по отладке? – Sss

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