2012-03-07 156 views
0

我有一個大的XMLTEXTREADER讀取我正在讀取。循環訪問xml元素問題

這裏是我的代碼

while (reads.Read()) 
{ 
    switch (reads.NodeType) 
    { 
     case XmlNodeType.Element: 
     { 

      if (reads.Name == "TITLE") 
      { 
       Response.Write("<Br />"); 
       Intel = reads.ReadInnerXml(); 
      } 
      Response.Write(Intel); 
      Intel = ""; 

     } 
     break; 
    } 
} 

這適用於在文檔打印的所有標籤大。現在我有一個名爲Authors的標籤,對於某些Books,有多個Author。

所以我的XML看起來像下面

<set1> 
<title>Test </Title> 
<intel_auth id="9"> 
<fname>ABC</fname> 
<mname>M.</mname> 
<lname>app</lname> 
    </intel_auth> 
    <intel_auth id="130"> 
<fname>Brad</fname> 
<lname>e</lname> 
</intel_auth_auth> 
<intel_auth id="31"> 
<fname>Robin</fname> 
<lname>neil</lname> 
</intel_auth> 
<intel_auth id="232"> 
<fname>Mason</fname> 
<lname>Rodriguez</lname> 
</intel_auth> 
</set1> 

我擁有多套並打印所有的標題和不打印旁邊作者姓名。

我用下面的代碼

case XmlNodeType.Element: 
          { 
           //string strURI = reads.NamespaceURI; 
           //string name = reads.Name; 
           string Authors = ""; 

           if (reads.Name == "TITLE") 
           { 
            Response.Write("<Br />"); 

            Intel = reads.ReadInnerXml(); 

            if (reads.Name == "FNAME") 
            { 
             Authors += reads.Value; 


            } 
            if (reads.Name == "MNAME") 
            { 
             Authors += reads.Value; 


            } 
            if (reads.Name == "LNAME") 
            { 
             Authors += reads.Value; 


            } 

           } 

           Response.Write(Intel+Authors); 
           Intel = ""; 
           Authors = ""; 
          } 
          break; 

回答

0

ReadInnerXml被調用,則使讀者收盤標籤之後的下一個節點,因此你的代碼永遠不會看到作者姓名的節點。該方法的文檔給出了細節。

嘗試ReadStartElement將其放置在intel_auth元素上。

0

Xml區分大小寫。更改所有比較以匹配您的xml的情況。在你的XML標題是titleTitle這是它?

如果你不介意的話,我可以幫你使用LINQ:

我想創建一個類名爲作者(我使用這些擴展:http://searisen.com/xmllib/extensions.wiki

public class Author 
{ 
    XElement self; 
    public Author(XElement self) { this.self = self; } 

    public int Id { get { return self.Get("id", 0); } } 
    public string LastName { get { return self.Get("lname", string.Empty); } } 
    public string FirstName { get { return self.Get("fname", string.Empty); } } 
    public string MiddleName { get { return self.Get("mname", string.Empty); } } 

    public override string ToString() 
    { 
     return FirstName + MiddleName + LastName; 
    } 
} 

然後一書類:

public class Book 
{ 
    XElement self; 
    public Book(XElement self) { this.self = self; } 

    public Author[] Authors 
    { 
     get { return _Authors ?? // if _Authors is null, create it and then return it 
      (_Authors = self.GetEnumerable("intel_auth", xauthor => new Author(xauthor)).ToArray()); } 
    } 
    Author[] _Authors; 

    public string Title 
    { 
     get { return self.Get("title", string.Empty); } 
    } 
} 

我不知道如何從XML片段載入書籍,但如果每本書是set1set1是節點該文件的根節點...

Book[] books = XElement.Load("file.xml") 
        .GetEnumerable("set1", xbook => new Book(xbook)) 
        .ToArray(); 

然後你可以遍歷所有的書,和所有的作家在一本書一樣:

foreach(Book book in books) 
{ 
    Response.Write(book.Title); 
    foreach(Author author in book.Authors) 
    { 
     Response.Write("<Br />" + author.ToString()); 
    } 
}