xml中具有相同元素名称的下一个节点

时间:2012-09-09 03:32:37

标签: c# xml parsing

我已经在这个问题上工作了几个小时了,我已经四处寻找没有运气的解决方案:(

我想要做的是打印出节点的名称,我所拥有的是存在的节点数量,所以我知道要循环多少次但是最难检索值

我尝试过:

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>

我想检索每个职位的职位详情

3 个答案:

答案 0 :(得分:2)

使用此代码循环遍历作业节点。

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>。在任何情况下,上述代码都可以让您访问您所追求的信息。

答案 1 :(得分:1)

使用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
}

答案 2 :(得分:0)

以下是将单个作业详细信息添加到字典列表的代码。 当有很多子节点时,它消除了在循环中选择单个节点。并且,更通用。

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