删除的xml元素未被删除

时间:2017-05-25 14:34:09

标签: c# xml xpath linq-to-xml

在以下代码段中,最后一个字符串"已删除"仍然有删除的元素。我首先转换为byte [],因为最终的实现输入将采用该形式。我正在循环通过已保存的节点并删除元素文档。是什么赋予了?所有的想法都非常感激。

        static void Main(string[] args)
        {
            var str =
                    @"
<CustomerCareReport xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.FireEms' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>
  <OtherInformation>
    <Documents xmlns:a='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Documents'>
      <a:Document>
        <a:Contents>Z2dn</a:Contents>
        <a:Description>yoyo</a:Description>
          <a:Id>1</a:Id>
      </a:Document>
      <a:Document>
        <a:Contents>ZmhmaA0KZmZmDQpmamZqZmpmDQo=</a:Contents>
        <a:Description>test 2</a:Description>
          <a:Id>2</a:Id>
      </a:Document>
    </Documents>
  </OtherInformation>
</CustomerCareReport>
";
            var element = XElement.Parse(str);
            XNamespace ns = element.Name.Namespace;
    // convert to bytes firstbecause final implementation input is byte array  
            byte[] bytes = Encoding.ASCII.GetBytes(str);
            using (var stream = new MemoryStream(bytes))
            {
                var deleteMarked = new List<XElement>();
                var xelement = XElement.Load(stream);

                var docs = xelement
                        .Descendants(ns + "Documents");

                foreach (XElement doc in docs.Descendants())
                {
                    if (doc.Name.LocalName.Equals("Document"))
                    {
                        var delDoc = doc;
                        deleteMarked.Add(delDoc);
                    }
                }

                foreach (var deldoc in deleteMarked)
                {
                    foreach (var node in deldoc.Elements())
                    {
                        node.Remove();
                    }
                }
                if (deleteMarked.Count > 0)
                {
                    stream.Close();
                    bytes = stream.ToArray();
                }
                var removed = System.Text.Encoding.Default.GetString(bytes);
                Console.WriteLine(removed);
            }
        }

0 个答案:

没有答案