C#解析XML:过滤QWE节点中不以AA开头的ID属性
C#实现XML中QWE节点ID属性过滤需求
需求:保留XML全部内容,仅对所有<QWE>节点的ID属性做过滤——只保留值以AA开头的ID属性,不符合条件的ID属性直接移除;其他节点(如<RTY>、<AAA>等)的所有内容原样保留。
原有代码的问题
你提供的代码仅遍历了根节点的直接子节点,而示例中<QWE>节点嵌套在<AAA>→<PPP>下,根本不会被遍历到,所以无法处理深层嵌套的QWE节点。需要递归遍历所有节点,才能找到所有QWE并处理其属性。
解决方案1:使用XmlDocument递归处理
这种方案兼容传统.NET框架,通过递归遍历所有节点,针对性处理QWE的ID属性:
// 加载原XML文档 XmlDocument doc = new XmlDocument(); doc.Load("你的XML文件路径"); // 递归处理所有节点的方法 void ProcessNode(XmlNode node) { if (node.NodeType == XmlNodeType.Element && node.Name == "QWE") { // 获取QWE节点的ID属性 XmlAttribute idAttr = node.Attributes["ID"]; if (idAttr != null && !idAttr.Value.StartsWith("AA")) { // 移除不符合条件的ID属性 node.Attributes.Remove(idAttr); } // 如果ID值以AA开头,或者没有ID属性,不做处理 } // 递归处理子节点 foreach (XmlNode childNode in node.ChildNodes) { ProcessNode(childNode); } } // 从根节点开始处理 ProcessNode(doc.DocumentElement); // 保存处理后的XML doc.Save("处理后的XML路径");
代码说明
- 递归遍历所有节点,确保无论QWE嵌套多深都能被找到
- 仅对QWE节点的ID属性做判断:存在且不以AA开头则移除,其他情况保留原样
- 所有非QWE节点的内容(包括子节点、属性)完全保留
解决方案2:使用LINQ to XML(更简洁)
如果使用.NET Core/.NET 5+,推荐用LINQ to XML,代码更简洁直观:
// 加载XML XDocument xDoc = XDocument.Load("你的XML文件路径"); // 找到所有QWE节点,处理ID属性 foreach (XElement qweNode in xDoc.Descendants("QWE")) { XAttribute idAttr = qweNode.Attribute("ID"); if (idAttr != null && !idAttr.Value.StartsWith("AA")) { idAttr.Remove(); } } // 保存结果 xDoc.Save("处理后的XML路径");
代码说明
Descendants("QWE")直接获取所有层级的QWE节点,无需递归- 同样逻辑判断ID属性,不符合则移除
- 代码量更少,可读性更高
示例输入与输出
输入XML
<MMM> <PPP> <AAA> <QWE ID="AABBCC"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE ID="AACCBB"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE ID="CCDDKK"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE ID="CCKKDD"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> </AAA> <BBB> <RTY ID="ASDF"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDG"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDH"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDJ"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> </BBB> </PPP> </MMM>
处理后输出XML
<MMM> <PPP> <AAA> <QWE ID="AABBCC"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE ID="AACCBB"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> <QWE> <NAME1>AA</NAME1> <NAME2>BB</NAME2> <NAME3>CC</NAME3> </QWE> </AAA> <BBB> <RTY ID="ASDF"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDG"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDH"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> <RTY ID="ASDJ"> <NAME1>AA</NAME1> <NAME2>BB</NAME2> </RTY> </BBB> </PPP> </MMM>
内容的提问来源于stack exchange,提问作者user16794037
相关产品推荐
相关产品推荐

