xml 中具有相同元素名称的下一个节点
Posted
技术标签:
【中文标题】xml 中具有相同元素名称的下一个节点【英文标题】:Next node in xml with same element name 【发布时间】:2012-09-02 09:52:38 【问题描述】:我已经在这个问题上工作了几个小时,但我已经四处寻找没有运气的解决方案:(
我要做的是打印出节点的名称,我所拥有的是存在的节点数量,所以我知道循环多少次,但最难检索值
我尝试过的:
int num = Convert.ToInt32(queuecount);
var jobs = QueueXML.SelectSingleNode(xpathjobsfilename).InnerText;
PreviousQueue = jobs.ToString();
//foreach(loop < num)
//
// if (CurrentQueue == PreviousQueue)
//
//
// else
//
// resultsListView.Items.Clear();
// resultsListView.Items.Add(jobs[num]);
//
// loop++;
//
foreach (char JobName in jobs.ToString())
if (CurrentQueue == PreviousQueue)
else
resultsListView.Items.Clear();
resultsListView.Items.Add(jobs[num]);
编辑:示例 XML
<jobs>
<job>
<timeleft>0:00:00</timeleft>
<mb>1419.60536003</mb>
<msgid></msgid>
<filename>Extended_Final</filename>
<mbleft>1274.33209419</mbleft>
<id>nzo_i7qxxq</id>
</job>
<job>
<timeleft>0:00:00</timeleft>
<mb>9.22459220886</mb>
<msgid></msgid>
<filename>Video2</filename>
<mbleft>9.22459220886</mbleft>
<id>2m3dv5</id>
</job>
</jobs>
我想检索每个工作的工作详细信息
【问题讨论】:
您能否展示并举例说明 XML 结构以及您正在寻找的结果? 我刚刚用一个例子编辑了原始问题 你到底想提取什么? 为什么不使用 LINQ2XML。它完全替代了底层 XmlReader 和 writer。它的 simple 和它的 cool . 【参考方案1】:使用此代码循环遍历您的作业节点。
XmlDocument doc = new Windows.Data.Xml.Dom.XmlDocument();
doc.Load(@"/path/to/xml/file");
foreach (XmlNode job in doc.SelectNodes("/jobs/job"))
string filename = job.SelectSingleNode("filename").InnerText;
double mbleft = double.Parse(job.SelectSingleNode("mbleft").InnerText);
我不太确定你想用它做什么。如果您想在整个程序中使用该信息,我将创建一个作业数据类型并将 XML 文档解析为 List<Job>
。在任何情况下,上述代码都将使您能够访问您所追求的信息。
【讨论】:
嗯,这是我正在尝试制作的 Metro 应用程序,似乎 XmlNode 命名空间不可用 错误 3 找不到类型或命名空间名称“XmlNode”(您是否缺少 using 指令或程序集引用?) @KPS 请购买像c# in a nutshell
这样的好c# 书籍并清除所有基础..错误是因为您没有包含System.Xml
命名空间..跨度>
@Anirudha,我同意他应该买一本书的想法。但是,地铁风格的应用程序中不存在 XmlNode,并且 System.Xml 命名空间位于其他地方。
你们是正确的,我不会对此争论:) 至于你的例子,它似乎永远不会到达节点: XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlResults.ToString()); foreach(doc.SelectNodes 中的 XmlElement 作业(“/jobs/job”)) string filename = job.SelectSingleNode("filename").InnerText; //double mb3 = double.Parse(job.SelectSingleNode("mbleft").InnerText); 【参考方案2】:
使用 LINQ2XML
XElement doc=XElement.Load("yourXMLfile.xml");
string timeleft,mb,msgid,filename,mbleft,id;
foreach(XElement elm in doc.Descendants().Elements("job"))
timeleft = elm.Element("timeleft").Value; //time left value
mb = elm.Element("mb").Value; //mb value
msgid = elm.Element("msgid").Value; //msgid value
filename = elm.Element("filename").Value; //filename value
mbleft = elm.Element("mbleft").Value; //mbleft value
id = elm.Element("id").Value; //id value
【讨论】:
我得到这个错误:错误3 只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句 @KPS 由于您没有将值分配给任何东西而导致的错误..将所有值分配给字符串...【参考方案3】:以下是将单个作业详细信息添加到字典列表的代码。 当有很多子节点时,它消除了在循环中选择单个节点。而且,更通用。
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(yourXmlString);
if (doc.HasChildNodes)
System.Xml.XmlNodeList jobLst = doc.DocumentElement.ChildNodes;
System.Collections.Generic.Dictionary<string, string> jobDescription;
var lstjobDescription = new System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>();
string name;
for (int i = 0; i < jobLst.Count; i++)
var responseDoc = new System.Xml.XmlDocument();
responseDoc.LoadXml(jobLst[i].OuterXml);
jobDescription = new System.Collections.Generic.Dictionary<string, string>();
foreach (System.Xml.XmlNode node in responseDoc.SelectNodes("//job/*")) //select all nodes of Job
jobDescription.Add(node.Name, node.InnerText);
lstjobDescription.Add(jobDescription);
【讨论】:
以上是关于xml 中具有相同元素名称的下一个节点的主要内容,如果未能解决你的问题,请参考以下文章
使用 SAX 解析器,如何解析具有相同名称标签但元素不同的 xml 文件?