循环遍历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
中删除一些标签?
谢谢
您可以在IEnumerable<T> where T : XNode
上使用Remove
扩展方法:
xml.Elements()
.Where(item => !JustThisProperties.Contains(item.Name.ToString()))
.Remove();
(您可能想让JustThisProperties
和IEnumerable<XName>
,这将使您摆脱ToString()
调用。)