将xml存储在对象中

时间:2012-04-13 21:05:46

标签: c# xml xml-parsing

说,我有这样的xml文件:

<?xml version="1.0"?>
<catalog>
   <title>My book catalog</title>
   <link>http://example.com/catalog</link>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
</catalog>

最后需要获取对象,我可以使用如下:

xml.title    //must return "My book catalog"
xml.link     //must return "http://example.com/catalog"
xml.book[0]  //is an object with following properties:
             //author, title, genre etc...
             //i.e., xml.book[0].author must return Gambardella, Matthew

希望没有类似的问题,对不起,如果有,我的坏,我没有找到。此外,如果有任何文件,特殊情况,请指出它,因为我找不到它。有很多关于xml解析的文档有各种各样的方法,但没有关于这种情况的信息。

提前感谢。

2 个答案:

答案 0 :(得分:1)

以下是使用these extension methods

的LinqToXml代码
[DebuggerDisplay("{Title}")]
public class Catalog
{
    XElement self;
    public Catalog(XElement catalog) { self = catalog; }
    public string Title { get { return self.Get("title", string.Empty); } }
    public Uri Link { get { return self.Get<Uri>("link", null); } }
    public Book[] Books
    {
        get { return _Books ?? (_Books = self.GetEnumerable("book", x => new Book(x)).ToArray()); }
    }
    Book[] _Books;
    [DebuggerDisplay("{Title} by {Author}")]
    public class Book
    {
        XElement self;
        public Book(XElement book) { self = book; }
        public string Id { get { return self.Get("id", string.Empty); } }
        public string Author { get { return self.Get("author", string.Empty); } }
        public string Title { get { return self.Get("title", string.Empty); } }
        public string Genre { get { return self.Get("genre", string.Empty); } }
        public decimal Price { get { return self.Get<decimal>("price", 0); } }
        public DateTime PublishDate { get { return self.Get("publish_date", DateTime.MinValue); } }
        public string Description { get { return self.Get("description", string.Empty); } }
    }
}

使用它:

Catalog catalog = new Catalog(XElement.Load(file)); // or .Parse(string)

答案 1 :(得分:0)

doc = XDocument.Load("path/to/file.xml");
List<book> items = doc.Root.Element("catalog").Elements("book").
        Select(e => new book(
            (string)e.Element("author").Value,
            (string)e.Element("title").Value,
            (string)e.Element("price").Value,
            (string)e.Element("publish_date").Value,
            (string)e.Element("description").Value,
            (string)e.Element("genre").Value
        )).ToList();