我正在使用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'标记中获取值。
非常感谢任何帮助!
答案 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";