我有一个XDocument
,我想从此删除XElement
。
请参阅以下代码,为什么不删除XElement
?
xml文件:
<Reports>
<Report>
<Id>45f6bf21-d1b4-431b-818c-c1cb1c9bb221</Id>
<Content>Example 1</Content>
<Date>2014/10/11</Date>
<Time>18:03</Time>
</Report>
<Report>
<Id>15c74518-64c0-459d-98a3-831734d96a76</Id>
<Content>Example 2</Content>
<Date>1393/10/12</Date>
<Time>04:00</Time>
</Report>
<Report>
<Id>a2a48e10-4b16-4484-8402-c13a74af3981</Id>
<Content>Example 3</Content>
<Date>2014/10/13</Date>
<Time>03:36</Time>
</Report>
</Reports>
服务:
public class ReportService : IReportService
{
private readonly List<Report> allReports;
private readonly XDocument data;
public ReportService()
{
allReports = new List<Report>();
data = XDocument.Load(HttpContext.Current.Server.MapPath("~/App_Data/Reports.xml"));
var reports = from st in data.Descendants("Report")
select new Report
{
Id = st.Element("Id").Value,
Content = st.Element("Content").Value,
Date = st.Element("Date").Value,
Time = st.Element("Time").Value
};
allReports.AddRange(reports.ToList());
}
public void Delete(string id)
{
Delete(d => d.Element("Id").ToString() == id);
}
public void Delete(Func<XElement, bool> @where)
{
data.Root.Elements("Report").Where(@where).Remove();
data.Save(HttpContext.Current.Server.MapPath("~/App_Data/Reports.xml"));
}
}
public interface IReportService
{
void Delete(string id);
void Delete(Func<XElement, bool> @where);
}
我的代码:
public class ReportsController : Controller
{
private readonly IReportService _reportService;
public ReportsController()
{
_reportService = new ReportService();
}
public void Delete(string id)
{
_reportService.Delete(id);
}
}
没有错误。但是不会删除XElement
。我该如何解决?
我需要从XElement
删除XDocument
。
答案 0 :(得分:1)
在查找要删除的节点时,您必须引用根元素
data.Root.Elements("Reports").Elements("Report").Where(@where).Remove();
你也可以寻找后代:
data.Descendants( “报告”),其中(@where)卸下摆臂();
无论哪种方式,data
都是从根Reports
节点开始引用整个XML文档结构,因此您必须通过多种方式遍历树,因为知道您的第一个元素是根元素而不是子元素。
答案 1 :(得分:1)
在Xml Linq中,只要我们.ToString
,它就代表xml而不是值[这里是MSDN] ,
这意味着当你这样做时,
d => d.Element("Id").ToString() == id
这里要比较的是
"<Id>45f6bf21-d1b4-431b-818c-c1cb1c9bb221</Id>" == "45f6bf21-d1b4-431b-818c-c1cb1c9bb221"
实际比较你需要使用Value
属性,所以lambda就像下面一样解决你的问题,
d => d.Element("Id").Value == id;
希望有所帮助!!