Как разметить ваш объект C # для десериализации этого XML - PullRequest
0 голосов
/ 27 марта 2012

Я не могу поверить, насколько невероятно сложным это было ...

У меня есть следующий XML ...

<Library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://mynamespace.com/books">
  <Rows>
    <Row>
      <Author><Name>Stephen King</Name></Author>
    </Row>  
   </Rows>
</Library>

Я бы хотел, чтобы объект десериализованного C # читался как... Library.Books[0].Author

Я пробовал миллион различных комбинаций маркировки атрибутов XML для десериализации, например ...

[XmlRootAttribute("Library", Namespace = "http://mynamespace.com/books", IsNullable = false)]
public class Library
{
    [XmlElement("Rows")]
    public List<Book> Books { get; set; }
}

[XmlRoot("Row")]
public class Book
{
    public Author Author { get; set; }
}

[XmlRoot("Author")]
public class Author
{
    public string Name { get; set; }
}

... и постоянно получаю "Автор"объект как ноль, когда я пытаюсь десериализовать.Это почти успешно ... Я получаю ArrayList с одним элементом Book в свойстве Books.Но за свою жизнь я не могу получить Автор.

Любой совет / помощь будет принята с благодарностью!

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Попробуйте

public class Library
{
    [XmlArray("Rows")]
    [XmlArrayItem("Row")]
    public List<Book> Books { get; set; }
}
1 голос
/ 27 марта 2012

Ну, если вы хотите написать это «от руки», вы можете сделать это с помощью следующих методов расширения: http://searisen.com/xmllib/extensions.wiki

public class Library
{
    XElement self;
    public Library() { self = XElement.Load("libraryFile.xml"); }
    public Book[] Books 
    { 
        get 
        { 
            return _Books ?? 
                (_Books = self.GetEnumerable("Rows/Row", x => new Book(x)).ToArray()); 
        } 
    }
    Book[] _Books ;
}

public class Book
{
    XElement self;
    public Book(XElement xbook) { self = xbook; }
    public Author Author 
    { 
        get { return _Author ??
            (_Author = new Author(self.GetElement("Author")); }
    Author _Author;
}

public class Author
{
    XElement self;
    public Author(XElement xauthor) { self = xauthor; }
    public string Name 
    { 
        get { return self.Get("Name", string.Empty); }
        set { self.Set("Name", value, false); }
    }
}

Для этого требуется немного больше стандартного кода, чтобы вы могли добавить новыйкниги, но ваш пост был о чтении (десерализации), поэтому я не добавил его.

...