【问题标题】:C# Xpath only returning first elementC# Xpath 只返回第一个元素
【发布时间】:2017-07-18 18:28:17
【问题描述】:

我正在使用 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 循环遍历每个“会议”标签,它也只从第一个“会议”标签中获取值。

任何帮助将不胜感激!

【问题讨论】:

  • 我认为您的 xpath 查询应该只是 jobnamejobexperience,没有斜杠。
  • 是的,xPath_* 变量不能有斜线。
  • 查看 this handy page 获取 XPath 备忘单。
  • @BradleyUffner Bravo!在 1 行中回答。
  • 我输入了一个正确的答案,但 zx485 打败了我。无论如何,我更喜欢他的解释。

标签: c# xml xpath


【解决方案1】:

所以问题是,即使 foreach 循环遍历每个“会议”标签,它也只从第一个“会议”标签中获取值。

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

因此,在您的 foreach 循环中,您选择整个文档中的所有 meeting 元素

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

然后 - 在循环中 - 您选择整个文档中的所有 //job 和所有 //jobexperience 元素

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

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多