2015-01-11 3 views
1

У меня есть файл XML, содержащий элементы, которые имеют списки элементов:десериализации XML, который имеет <li></li>

<recipe> 
<title>Recipe 1</title> 
<ingredients><li>eggs</li><li>milk</li><li>etc...</li></ingredients> 
<instructions><li>break eggs</li><li>spill milk</li><li>enjoy!</li></ingredients> 
</recipe> 

Я использую Visual Studio C# XmlReader.Deserialize() десериализации XML в классе, который я хотел бы выглядеть так:

public class recipe 
{ 
string title; 
string ingredients[]; 
string instructions[]; 
} 

Где каждый элемент ингредиентов и инструкций будет текстом между тегами li.

Хуже ухудшается, я бы принял ингредиенты и инструкции, каждая из которых была единственной строкой, которую я мог бы затем проанализировать теги li.

Любые предложения о том, как это сделать?

+0

Можете ли вы разместить весь xml? – aloisdg

+0

Похоже, вы ничего не пробовали, прежде чем задавать этот вопрос, так как 'string components [];' не является допустимым объявлением C#. – EZI

ответ

2

похоже, что вы сделали небольшую ошибку в своем коде. вы закрываете инструкции с/ингредиентами.

это должно работать правильно десериализация к классу

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class recipe 
{ 

    private string titleField; 

    private string[] ingredientsField; 

    private string[] instructionsField; 

    public string title 
    { 
     get 
     { 
      return this.titleField; 
     } 
     set 
     { 
      this.titleField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlArrayItemAttribute("li", IsNullable = false)] 
    public string[] ingredients 
    { 
     get 
     { 
      return this.ingredientsField; 
     } 
     set 
     { 
      this.ingredientsField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlArrayItemAttribute("li", IsNullable = false)] 
    public string[] instructions 
    { 
     get 
     { 
      return this.instructionsField; 
     } 
     set 
     { 
      this.instructionsField = value; 
     } 
    } 
} 
+0

Вы должны использовать свойство auto-property вместо свойства с полями поддержки. См. Мой [пример] (http://stackoverflow.com/a/27888054/1248177). – aloisdg

+0

@aloisdg только для изучения: есть ли осязаемая причина или он должен содержать код кратким? – user2835725

+0

Процитировать Джеффа Этвуда «Самое важное, что нужно убрать здесь, - это не писать код, который не имеет значения. И обертки свойств вокруг публичных переменных являются самой сутью бессмысленного кода. '[Подробнее здесь] (http://blog.codinghorror.com/properties-vs-public-variables/). – aloisdg

1

Первого у вас есть ошибки, вы должны прочитать крупный тег <instructions>.

Ну, ваш XML:

<?xml version="1.0" encoding="UTF-8"?> 
<recipe> 
    <title>Recipe 1</title> 
    <ingredients> 
     <li>eggs</li> 
     <li>milk</li> 
     <li>etc...</li> 
    </ingredients> 
    <instructions> 
     <li>break eggs</li> 
     <li>spill milk</li> 
     <li>enjoy!</li> 
    </instructions> 
</recipe> 

Вы должны использовать property для своего класса:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public class recipe 
{ 
    public string title { get; set; } 

    [System.Xml.Serialization.XmlArrayItemAttribute("li", IsNullable = false)] 
    public string[] ingredients { get; set; } 

    [System.Xml.Serialization.XmlArrayItemAttribute("li", IsNullable = false)] 
    public string[] instructions { get; set; } 
} 

Я использую generator построить этот класс. Генератор добавляет некоторые атрибуты к вашим свойствам. Узнайте о них here.

0

Да, у вас была ошибка в вашем XML, он должен выглядеть следующим образом:

<recipe> 
<title>Recipe 1</title> 
<ingredients> 
    <li>eggs</li><li>milk</li><li>etc...</li> 
</ingredients> 
<instructions> 
    <li>break eggs</li><li>spill milk</li><li>enjoy!</li> 
</instructions> 
</recipe> 

Кроме того, ваш класс должен быть:

[XmlRoot("recipe")] 
public class Receipe 
{ 
    [XmlElement("title")] 
    public string Title { get; set; } 

    [XmlArray("ingredients")] 
    [XmlArrayItem("li")] 
    public string[] Ingridients { get; set; } 

    [XmlArray("instructions")] 
    [XmlArrayItem("li")] 
    public string[] Instructions { get; set; } 
} 

И, наконец, код:

var serializer = new XmlSerializer(typeof(Receipe)); 
var reader = new StringReader(xml); 
var receipe = (Receipe)serializer.Deserialize(reader); 
reader.Close(); 
+0

Спасибо за помощь! – Pfredd

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