使用c#

时间:2015-10-28 18:29:13

标签: c# xml xpath

我有一个XML文件,结构如下:

    <deftable>
        <table>
            <job jobname="">
                <incond name="" />
                <outcond name="" />
            </job>
            <job jobname="">
                <incond name="" />
                <outcond name="" />
                <incond name="" />
                <outcond name="" />
            </job>
        </table>
        <table>
            <job jobname="">
                <incond name="" />
                <outcond name="" />
            </job>
            <job jobname="">
                <incond name="" />
                <outcond name="" />
                <incond name="" />
                <outcond name="" />
            </job>
        </table>
    </deftable>
标签内的

deftable我可以有多个表。 在表格标签中我可以有多个JOB,在那些我有多个incond和outcond。

我试图获取jobname的值,以及incond和outcond的name属性的值。

我已经尝试了几种方法来实现这一目标。我尝试过的最新事情就是这个,但我似乎无法让它发挥作用。

XmlDocument doc = new XmlDocument();
       doc.Load(file);

       XmlNodeList nodes = doc.DocumentElement.SelectNodes("/deftable/table");


       int i = 1;
       foreach (XmlNode node in nodes)
       {              
           Console.WriteLine(node["job"].GetAttribute("jobname") + " -- " + i);
           i++;

           XmlNodeList nodes2 =  doc.DocumentElement.SelectNodes("/deftable/table/job");
           foreach (XmlNode item in nodes2)
           {
               Console.WriteLine(item["incond"].GetAttribute("name"));
           }


       }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我不确定以下代码段对您有多大帮助,但您可以针对您的情况尝试使用Linq to Xml,如下所示。

 XDocument jobsRoot = XDocument.Load(@"C:\Jobs.xml");
 var jobData= jobsRoot.Descendants()
              .Where(it => it.Name.LocalName == "job")
              .Select(job => new
               {
                  JobName = job.Attribute("jobname").Value,
                  IncondName = job.Descendants().Where(it => it.Name.LocalName == "incond").Select(inc => inc.Attribute("name").Value),
                  OutcondName = job.Descendants().Where(it => it.Name.LocalName == "outcond").Select(inc => inc.Attribute("name").Value)
               });

答案 1 :(得分:0)

我认为linq to XML实现没有XML到Dynamic

那么好

Deserialize XML To Object using Dynamic上描述(因为你提到过你尝试了几种方法)。另外,上面的答案可能会这样做。