C#Xpath只返回第一个元素

时间:2017-07-18 18:28:18

标签: c# xml xpath

我正在使用HTMLAgilityPack来读取和加载XML文件。加载文件后,我想将其中的值插入数据库。

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循环遍历每个'meeting'标记,它也只从第一个'meeting'标记中获取值。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

  

所以问题在于,尽管foreach循环正在经历每一次会议。标签,它只从第一次会议中获取价值。标签

是的,这就是代码的作用。 XPath operator //选择 all 整个文档中的元素,例如//job在整个文档中选择所有 job元素。

因此,在foreach循环中,使用

选择整个文档中的所有meeting元素
doc.DocumentNode.SelectNodes("//meeting"))

然后 - 在循环中 - 您使用

选择整个文档中的所有//job和所有//jobexperience元素
string xPath_job = "//job";
string xPath_job_experience = "//jobexperience";

所以你一遍又一遍地选择所有元素的第一个元素......因此给你的印象是你只得到第一个元素。

所以更改代码的方式是选择当前 meeting元素的子元素(通过删除//运算符):

string xPath_job            = "job";
string xPath_job_experience = "jobexperience";