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&lt;Job&gt;。在任何情况下,上述代码都将使您能够访问您所追求的信息。

【讨论】:

嗯,这是我正在尝试制作的 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 中具有相同元素名称的下一个节点的主要内容,如果未能解决你的问题,请参考以下文章

具有相同元素和属性名称的 RestKit XML 映射

使用 SAX 解析器,如何解析具有相同名称标签但元素不同的 xml 文件?

如何从元素中具有相同名称的 xml 文件中获取特定值?

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

连接元素节点由相同的状态名称组成一个元素节点

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件