Sohaib Javed Ответов: 1

Десериализация XML ничего не возвращает


<root>
    <posts>
        <post>
            <id>7</id>
            <USERNAME>sohaib</USERNAME>
            <TITLE>help</TITLE>
            <USERID>1</USERID>
        </post>
        <post>
            <id>7</id>
            <USERNAME>sohaib</USERNAME>
            <TITLE>help</TITLE>
            <USERID>1</USERID>
        </post>
    </posts>
    <comments>
        <comment>
            <COMMENTID>2</COMMENTID>
            <COMMENT_TEXT>help</COMMENT_TEXT>
        </comment>
        <comment>
            <COMMENTID>2</COMMENTID>
            <COMMENT_TEXT>help</COMMENT_TEXT>
        </comment>
        <comment>
            <COMMENTID>2</COMMENTID>
            <COMMENT_TEXT>help</COMMENT_TEXT>
        </comment>
    </comments>
</root>



и мой код C#, чтобы десериализовать этот XML-файл

XmlSerializer xsserializer = new XmlSerializer(typeof(root));
FileStream reader = new FileStream(&quot;abc.xml&quot;,FileMode.Open);
object obj = xsserializer.Deserialize(reader);
root timeline = (root) obj;


Где мой корневой класс выглядит следующим образом

[Serializable, XmlRoot(&quot;root&quot;), XmlType(&quot;root&quot;)]
public class root
{
    [XmlElement(&quot;Posts&quot;)]
    public List&lt;Post&gt;  Posts =new List&lt;Post&gt;();
    [XmlElement(&quot;Comments&quot;)]
    public List&lt;Comment&gt; Comments = new List&lt;Comment&gt;();

}
public class Post
{
    [XmlElement(&quot;TITLE&quot;)]
    public string TITLE;
    [XmlElement(&quot;USERID&quot;)]
    public long USERID;
    [XmlElement(&quot;USERNAME&quot;)]
    public string USERNAME;
    [XmlElement(&quot;id&quot;)]
    public long id;
}

public class Comment
{
    [XmlElement(&quot;COMMENTID&quot;)] public long COMMENTID;
    [XmlElement(&quot;COMMENT_TEXT&quot;)] public string COMMENT_TEXT;

}


Я не сталкиваюсь ни с каким исключением, ни с какой ошибкой, но все же он дает 0 элементов в сообщениях и 0 в комментариях.
Не могли бы вы помочь мне понять, где я ошибаюсь?

Я ценю ваш ответ.

Спасибо Sohaib

1 Ответов

Рейтинг:
4

Maciej Los

2 примечания:
1) c# чувствителен к регистру, что означает, что post это не равносильно Post
2) List(of comments) и List(of posts) объявляется неправильно

Измените его объявление на:

[Serializable, System.Xml.Serialization.XmlRoot("root"), System.Xml.Serialization.XmlType("root")]
public class root
{
    //instead of: [System.Xml.Serialization.XmlElement("Posts")], use:
    [System.Xml.Serialization.XmlArray("posts"), System.Xml.Serialization.XmlArrayItem("post", typeof(Post))]
    public List<Post>  Posts =new List<Post>();
    //[System.Xml.Serialization.XmlElement("Comments")]
    [System.Xml.Serialization.XmlArray("comments"), System.Xml.Serialization.XmlArrayItem("comment", typeof(Comment))]
    public List<Comment> Comments = new List<Comment>();

}


Для получения дополнительной информации, пожалуйста, смотрите:
Сериализация и десериализация XML: Часть 1[^]
Сериализация и десериализация XML: Часть 2[^]
Полный пример сериализации и десериализации пользовательских коллекций классов[^]


Sohaib Javed

Спасибо за ваш ответ. Я попробую это сделать.

Sohaib Javed

Эй, это здорово. Это работает. Не могли бы вы рассказать мне, как решить это исключение при десериализации?

"Строка '9/30/2015 12:59:37 PM' не является допустимым значением AllXsd"

в то время как я получаю его в виде цепочки. Это ответ, который я получаю от веб - службы. Поэтому я не могу изменить xml.

Maciej Los

Преобразование даты и времени из строки зависит от локализации. Пожалуйста, следуйте за этим: Глобализация и локализация приложений .NET Framework Лучший способ обойти это-использовать значение datetime.Метод TryParse внутри IFormatProvider как класс ClutureInfo.