2015-10-28 139 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) 
       });