2015-08-13 120 views
1

的這一部分,我很新的XML和有關於這種類型的文件的解析問題:如何解析XML

XML文檔:

<?xml version="1.0" encoding="UTF-8"?> 
<ISBNdb server_time="2005-07-29T02:41:22"> 
    <BookList total_results="1" page_size="10" page_number="1" shown_results="1"> 
     <BookData book_id="law_and_disorder" isbn="0210406240"> 
      <Title>Law and disorder</Title> 
      <TitleLong>Law and disorder: law enforcement in television network news</TitleLong> 
      <AuthorsText>V. M. Mishra</AuthorsText> 
      <PublisherText publisher_id="asia_pub_house">New York: Asia Pub. House, c1979.</PublisherText> 
      <Details dewey_decimal="302.2/3" 
         dewey_decimal_normalized="302.23" 
         lcc_number="PN4888" 
         language="eng" 
         physical_description_text="x, 127 p. ; 22 cm." 
         edition_info="" 
         change_time="2004-10-19T23:52:56" 
         price_time="2005-07-29T02:06:41" /> 
     </BookData> 
    </BookList> 
</ISBNdb> 

我將如何去獲得該部分文件的ISBN編號<BookData book_id="law_and_disorder" isbn="0210406240">?下面是我使用的解析C#:

C#解析代碼

XmlNodeList nodes = doc.DocumentElement.SelectNodes("/ISBNdb/BookList"); 
      List<Book> books = new List<Book>(); 

      foreach (XmlNode node in nodes) 
      { 
       Book book = new Book(); 

       book.author = node.SelectSingleNode("BookData/AuthorsText").InnerText; 
       book.title = node.SelectSingleNode("BookData/Title").InnerText; 
       book.ISBN = node.SelectSingleNode("BookData").LastChild.ToString(); 

       books.Add(book); 

       addInfo(book.author, book.title, book.ISBN); 
      } 

據我所知,有不同的「節點」,如「標題」和「詳細資料」。但是,我不明白如何從節點「標籤」本身獲取信息。任何澄清是非常讚賞,並隨時糾正我對我的不正確的'定義'

謝謝!

+2

'我是很新的XML'最好開始學習Linq2Xml,漂亮的API,使用更方便。 – Eser

+0

如果我要使用這個Linq2XML,我能否輕鬆修改我的代碼來使用它? –

回答

5
book.ISBN = node.SelectSingleNode("BookData").Attributes["isbn"].Value; 

書號是BookData的屬性和沒有兒童(即Title

+0

感謝您的澄清。這很好! –

-2

這是XML規範中的一個屬性。 http://www.w3.org/TR/xpath/可能很方便查看,如果有的話,對於「數據模型」部分來說,可以分解所有不同的位。知道它是那麼的屬性使得查找所需的C#的東西容易...

1

試試這個:

var detailsNode = node.SelectSingleNode("BookData/Details"); 
var dewey = detailsNode.Attributes["dewey_decimal"].Value 

請注意,在嘗試分配其值之前,應該使用空警號來確保該屬性存在。

+0

感謝您的空檢查建議:) –

2

建議,LINQ to XML是一個更好的API。您可以解析或使用XDocument.ParseXDocument.Load,那麼你可以創建你的本本加載XML:

var books = from bookData in doc.Descendants("BookData") 
      select new Book 
      { 
       author = (string)bookData.Element("AuthorsText"), 
       title = (string)bookData.Element("Title"), 
       isbn = (string)bookData.Attribue("isbn") 
      }; 
+0

感謝您使用LINQ to XML的幫助。 –