2017-07-18 136 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";