每个循环的 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 节点读取的主要内容,如果未能解决你的问题,请参考以下文章