2011-01-10 45 views
5

Tôi đang cố gắng lặp qua tệp Xml và hiển thị giá trị cho tài khoản trong thư.Đọc nút Xml cho mỗi vòng lặp

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var"); 
foreach (XmlNode no in nodeList) 
{ 
    XmlNode node = testDoc.SelectSingleNode("/details/row/var[@name='account']"); 
    test.actual = node.Attributes["value"].Value; 

    MessageBox.Show(test.account); 
} 

Hộp tin nhắn hiện đang hiển thị bản ghi đầu tiên lặp lại, làm thế nào tôi có thể đến hồ sơ tiếp theo?

Cảm ơn bạn đã nhập trước.

+2

Bạn không sử dụng không biến mà là giá trị từ mỗi lần lặp sẽ là một khởi đầu điểm –

Trả lời

12

Bạn liên tục chỉ định node với cùng một yếu tố từ testDoc. Không rõ ràng test.account là gì (có thể là một loại nhập sai cho test.actual)?

no là biến sẽ lặp lại nội dung của nodeList - Tôi tưởng tượng bạn định sử dụng nó.

EDIT sau chỉnh sửa của OP Bây giờ bạn đã cho chúng ta thấy những gì NodeList là, tôi nghi ngờ bạn muốn làm một cái gì đó giống như thay vì điều này:

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var[@name='account']"); 
foreach (XmlNode no in nodeList) 
{  
    test.actual = no.Attributes["value"].Value; 
    ... 
+0

tại chỗ nhờ @Chris! – Ebikeneser

0

Tôi không chắc chắn 100%, nhưng bạn có thể cần sử dụng đệ quy. Nếu không, nó sẽ giống như sau:

XmlDocument doc = //etc.. 
foreach(XmlNode node in doc.ChildNodes) 
{ 
    if(node.Name == "account") 
    { 
     MessageBox.Show(node.Value); 
    } 
} 
+0

-1: trong khi sửa mã là đúng (sử dụng nút) tôi không thấy đệ quy ở đây ... –

+0

Vâng, tôi đã nói "nếu không" – ferr

+0

Tôi cần đọc toàn bộ bài đăng ... chỉnh sửa để tôi có thể hoàn tác -1. Ngoài ra tôi vẫn không thấy lý do tại sao OP sẽ sử dụng đệ quy - XPath đã chọn các nút sâu như mong muốn ... –

0

Bạn không nên dành thời gian đọc nút xml bằng nút. Hãy thử Deserialization:

+0

-1: Điều đó phụ thuộc hoàn toàn vào những gì mà XML infoset trông như thế nào và những gì anh ta đang cố gắng làm với nó. Deserializing cho một loại có thể tải công việc không cần thiết cả lúc thiết kế và thời gian chạy, hoặc thậm chí có thể không thể. –

+0

@ Chris ~ thực hành tốt nhất luôn luôn tốt hơn so với bất kỳ thực hành nào khác. Chỉ muốn OP biết rằng * Deserialization * không tồn tại. Nếu tôi đã hỏi câu hỏi này, tôi sẽ đề cập đến rằng tôi không quan tâm đến Deserialization vì xml là quá phức tạp và tôi chỉ cần một phần nhỏ mà ông không. – Pabuc

1

Hãy thử như sau:

 //Create an xml reader; 
     XmlDocument _xmlDocument = new XmlDocument(); 
     _xmlDocument.Load(/*File Name here*/); 

     //Select the element with in the xml you wish to extract; 
     XmlNodeList _nodeList = _xmlDocument.SelectNodes("/details/row/var[@name='account']"); 

     //Display the values in the node list to the screen; 
     foreach (XmlNode _node in _nodeList) 
     { 
      String _nodeValue = _node.InnerText.ToString(); 
      MessageBox.Show(_nodeValue.ToString()); 
     } 
3

Dưới đây là các mẫu cho giá trị nút cha để có được thông tin của đứa trẻ nodes.here tôi đang sử dụng các ReportItems ParentNode và In chỉ hình ảnh đứa trẻ nút.

 xmldoc.Load(rdlFile); 
     StringBuilder sb=new StringBuilder(); 
     XmlNode node = xmldoc.GetElementsByTagName("ReportItems")[0]; 
     XmlNodeList list = node.ChildNodes; 
     atributes=new string[node.ChildNodes.Count]; 
     int l = 0; 
     for (int j = 0; j < node.ChildNodes.Count; j++) 
     { 


      if (list[j].Name == "Image") 
      { 
       XmlAttributeCollection att = list[j].Attributes; 
       atributes[l] = att[0].Value.ToUpper(); 

      } 
      l++; 
     } 
     for (int i = 0; i < node.ChildNodes.Count; i++) 
     { 
      if (searchText.Text.ToUpper() == atributes[i]) 
      { 
       XmlNodeList lastlist = node.ChildNodes; 
       XmlNodeList endlist = lastlist[i].ChildNodes; 
       for (int k = 0; k < endlist.Count; k++) 
       { 
        sb.Append(endlist[k].Name+" - "+ endlist[k].InnerText); 
        sb.Append("\n"+"\n"); 
       } 

      } 

     } 

cho tôi biết nếu bạn có nghi ngờ ..

5
 XmlDocument doc = new XmlDocument(); 
     doc.Load("d:\\test.xml"); 
     XmlNodeList node = doc.GetElementsByTagName("w:r"); 
     foreach (XmlNode xn in node) 
     { 
      try 
      { 
       if (xn["w:t"].InnerText != null) 
       { 
        if (xn["w:t"].InnerText == "#") 
        { 
         string placeHolder = xn["w:t"].InnerText; 
         foreach (XmlNode a in node) 
         { 
          if (a["w:t"].InnerText != "#") 
          { 
           string placeHolder1 = a["w:t"].InnerText; 
          } 
         } 
        } 
       } 
      } 

      catch (Exception e) 
      { 
       Console.Write(e); 
      } 
     } 
2

Hãy thử điều này,

XmlDocument xdoc = new XDocument(); 

xdoc.Load("*/File/*"); 
string xmlcontents = xdoc.InnerXml; 

var xpath = "(/details/row/var[@name='account'])"; 

XmlNodeList lists = xdoc.DocumentElement.SelectNodes(xpath); 

foreach (XmlNode _node in lists) 
{ 
    string _nodeValue = _node.InnerText; 
    MessageBox.Show(_nodeValue); 
} 
Các vấn đề liên quan