【问题标题】:Xml node reading for each loop每个循环的 XML 节点读取
【发布时间】:2011-06-06 17:20:21
【问题描述】:

我正在尝试遍历 Xml 文件并在消息中显示帐户的值。

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);
 }

消息框当前重复显示第一条记录,如何才能进入下一条记录?

提前感谢您的意见。

【问题讨论】:

  • 您没有使用 no 变量,这是每次迭代的值将是一个起点

标签: c# xml loops foreach nodes


【解决方案1】:

试试这个,

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);
}

【讨论】:

    【解决方案2】:
            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);
                }
            } 
    

    【讨论】:

      【解决方案3】:

      这是获取子节点信息的父节点值示例。这里我使用的是 ReportItems ParentNode 和仅打印图像子节点。

              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");
                      }
      
                  }
      
              }
      

      如果您有任何疑问,请告诉我..

      【讨论】:

        【解决方案4】:

        您反复为node 分配来自testDoc 的相同元素。不清楚test.account 是什么(可能是test.actual 打错了)?

        no 是迭代 nodeList 内容的变量 - 我想你打算使用它。

        EDIT 在编辑 OP 之后 现在你已经向我们展示了 nodeList 是什么,我怀疑你想要做这样的事情:

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

        【讨论】:

          【解决方案5】:

          尝试以下方法:

                  //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());
                  }
          

          【讨论】:

            【解决方案6】:

            您不应该花时间逐个节点地阅读 xml。试试Deserialization

            【讨论】:

            • -1 :这完全取决于 XML 信息集的外观以及他试图用它做什么。在设计时和运行时,反序列化到一个类型可能会带来大量不必要的工作,甚至可能是不可能的。
            • @Chris ~ 最佳实践总是比任何其他实践都好。只是想让 OP 知道 Deserialization 确实存在。如果我问这个问题,我会提到我对反序列化不感兴趣,因为 xml 太复杂了,我只需要他不需要的一小部分。
            【解决方案7】:

            我不是 100% 确定,但您可能需要使用递归。如果没有,它应该看起来像这样:

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

            【讨论】:

            • 我需要仔细阅读整篇文章...编辑以便撤消-1。此外,我仍然认为 OP 没有理由使用递归 - XPath 已经选择了尽可能深的节点......
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-20
            • 2021-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-23
            • 2020-11-13
            相关资源
            最近更新 更多