2017-07-18 166 views
1

我正在使用HTMLAgilityPack讀取和加載XML文件。文件加載後,我想從它插入到數據庫中的值。C#Xpath僅返回第一個元素

XML看起來是這樣的:

<meeting> 
     <jobname></jobname> 
     <jobexperience></jobexperience> 
</meeting> 

我試圖完成一個foreach循環中這樣使用XPath語句,在這裏看到:

DataTable dt = new DataTable(); 
//Add Data Columns here 
dt.Columns.Add("JobName"); 
dt.Columns.Add("JobExperience"); 

// Create a string to read the XML tag "job" 
string xPath_job = "//job"; 
string xPath_job_experience = "//jobexperience"; 


/* Use a ForEach loop to go through all 'meeting' tags and get the values 
    from the 'JobName' and 'JobExperience' tags */ 

foreach (HtmlNode planned_meeting in doc.DocumentNode.SelectNodes("//meeting")) 
{ 
    DataRow dr = dt.NewRow(); 

    dr["JobName"] = planned_meeting.SelectSingleNode(xPath_job).InnerText; 

    dr["JobName"] = planned_meeting.SelectSingleNode(xPath_job_experience).InnerText; 

    dt.Rows.Add(dr); 

}  

所以問題是,即使在foreach循環正在經歷每個「會議」標記,它只從第一個「會議」標記獲取值。

任何幫助將不勝感激!

+3

我覺得你的XPath查詢應該僅僅是'作業名稱''和'jobexperience',沒有斜槓。 –

+1

Yup xPath_ *變量不能有斜槓。 – StuartLC

+0

請參閱[此便利頁](https://www.w3schools.com/xml/xpath_syntax.asp)瞭解XPath備忘單。 –

回答

2

所以問題是,即使foreach循環正在經歷每個「會議」標記,它只會從第一個「會議」標記獲取值。

是的,這就是代碼的作用。 XPath operator //選擇整個文檔中的元素,例如全部//job選擇全部job元素在整個文檔中。

因此,在您的foreach循環您選擇整個文檔中的所有meeting元素與

doc.DocumentNode.SelectNodes("//meeting")) 

,然後 - 在循環 - 你選擇整個文檔中的所有//job和所有//jobexperience元素與

​​

所以你選擇第一個元素所有元素 - 一遍又一遍......因此,你只能得到第一個元素的印象。


所以更改代碼的方式,將當前meeting元素的孩子都被選擇(通過去除//運營商):

string xPath_job   = "job"; 
string xPath_job_experience = "jobexperience"; 
相關問題