循环遍历XElement并删除一些标记

本文关键字:删除 遍历 XElement 循环 | 更新日期: 2023-09-27 18:12:30

请考虑以下代码:

public static XElement ToXElement<T>(this object obj,List<string> JustThisProperties)
{
    using (var memoryStream = new MemoryStream())
    {
        using (TextWriter streamWriter = new StreamWriter(memoryStream))
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(streamWriter, obj);
            var xml = XElement.Parse(Encoding.UTF8.GetString(memoryStream.ToArray()));
            xml.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
            foreach (var item in xml.Elements())
            {
                if (JustThisProperties.Where(o=>o == item.Name.ToString()).Any() == false)
                {
                    xml.Elements(item.Name.ToString()).Remove();
                }
            }
            return xml;
        }
    }
}
XML:

<Log>
   <tbl>
       <ID>21</ID>
       <MasterID>3</MasterID>
       <C_2>1</C_2>
       <C_3>1</C_3>
       <C_4>1</C_4>
       <C_5>2000</C_5>
       <C_6>2</C_6>
       <C_7>2</C_7>
       <C_8>2</C_8>
       <C_9>2</C_9>
       <C_10>2</C_10>
    </tb>
</Log>

我只想序列化一些属性。例如,当上面生成XML时,我想删除除{C_2,C_9,C_10}以外的所有标签。问题是当它移除C_2时,因为XML已经改变了,它没有继续foreach并打破它。如何从XElement中删除一些标签?

谢谢

循环遍历XElement并删除一些标记

您可以在IEnumerable<T> where T : XNode上使用Remove扩展方法:

xml.Elements()
   .Where(item => !JustThisProperties.Contains(item.Name.ToString()))
   .Remove();

(您可能想让JustThisPropertiesIEnumerable<XName>,这将使您摆脱ToString()调用。)