2015-10-28 143 views
0

我有以下结构的XML文件:deftable我可以有多个表,在标签内无法读取XML文件用C#

<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> 

。 在表标记我可以有多个作业,并在那些我有多个incind和第二。

我正在尝试获取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")); 
      } 


     } 

任何帮助,非常感谢。

+0

你用调试器通过它吗?输出是什么?预期产出是多少?你有什么线索,哪些部分的代码不工作? –

+0

这里是一个在线xpath测试器,你给它一个文档和一个xpath:http://www.freeformatter.com/xpath-tester.html从这个我推断出你需要两个正斜杠,如'// deftable/table' – GreatAndPowerfulOz

+1

[检查此线程](http://stackoverflow.com/questions/642293/how-do-i-read-and-parse-an-xml-file-in-c)如何去做这件事。看起来你并没有在挖掘循环中的子节点。 –

回答

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