每个循环的 XML 节点读取

Posted

技术标签:

【中文标题】每个循环的 XML 节点读取【英文标题】:Xml node reading for each loop 【发布时间】: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 变量,这是每次迭代的值将是一个起点 【参考方案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 已经选择了尽可能深的节点......

以上是关于每个循环的 XML 节点读取的主要内容,如果未能解决你的问题,请参考以下文章

c# xPathDocument读取xml节点属性

xml节点foreach循环

c# 读取xml文件 查找节点时 报null值?

在 C# 中循环遍历 XML 的特定节点

C# XML 如何直接根据属性值 读取 对应的值 怎么写???

java如何读取xml节点元素值?