从XDocument中删除XElement

时间:2015-01-02 02:15:19

标签: xml linq-to-xml xelement

我有一个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

2 个答案:

答案 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;

希望有所帮助!!