我有一个列表行,它包含10个不同的记录。我在C#控制台应用程序中循环此列表并将值插入另一个列表但它只选择第一条记录并将其插入新列表10次。
当我调试时,循环中会显示唯一值,但它们不会被分配给左变量。
List<Job> jobList=new List<Job>();
foreach (var row in rows)
{
Job job = new Job();
job.Title = row.SelectSingleNode("//h2[@class='jobtitle']").ChildNodes[1].Attributes["title"].Value;
job.summary = row.SelectSingleNode("//span[@class='summary']").InnerText
jobList.add(job);
}
任何想法,发生了什么?
我也使用垃圾收集器,但仍然没有改进:
job = null;
GC.Collect();
GC.WaitForPendingFinalizers();
这是@Andrew建议之后的更新代码,但它不起作用。右侧保存更新的值,但它们未分配给左侧变量。
foreach (var row in rows)
{
try
{
var job = new Job();
var title = row.SelectSingleNode("//h2[@class='jobtitle']").ChildNodes[1].Attributes["title"].Value;
var company = row.SelectSingleNode("//span[@class='company']").InnerText.Replace("\n", "").Replace("\r", "");
var location = row.SelectSingleNode("//span[@class='location']").InnerText.Replace("\n", "").Replace("\r", "");
var summary = row.SelectSingleNode("//span[@class='summary']").InnerText.Replace("\n", "").Replace("\r", "");
job.Title = title;
job.Company = company;
job.Location = location;
job.Summary = summary;
jobList.Add(job);
job = null;
GC.Collect();
GC.WaitForPendingFinalizers();
counter++;
Status("Page# " + pageNumber.ToString() + " : Record# " + counter + " extracted");
}
catch (Exception)
{
AppendRecords(jobList);
jobList.Clear();
}
//save file
}
答案 0 :(得分:3)
您好我不告诉我们rows
变量的相关内容,但我认为这些是单个XmlDocument中的节点。用于从这些节点提取值的XPath表达式不正确,因为它们将始终导航到文档中的同一节点,而不管当前的row
节点。
这是一个演示问题的简单示例: -
static void Main(string[] args)
{
XmlDocument x = new XmlDocument();
x.LoadXml(@"<rows> <row><bla><h2>bob1</h2></bla></row> <row><bla><h2>bob2</h2></bla></row> </rows>");
var rows = x.GetElementsByTagName("row");
foreach (XmlNode row in rows)
{
var h2 = row.SelectSingleNode("//h2").ChildNodes[0].Value;
Console.WriteLine(h2);
}
}
此输出将为
bob1
bob1
不是你所期待的?在Dot Net Fiddle中玩一个例子。再看看你的XPath表达式。您当前的表达式//h2
表示&#34;无论当前节点如何,都会在文档中提供所有h2
个元素&#34;。而.//h2
会为您提供当前h2
节点后代的row
元素,这可能就是您所需要的。