使用XMLDocument获取XML中<link-entity>节点下的所有<condition>节点
问题描述
给定如下XML结构:
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true"> <entity name="contact"> <attribute name="contactid" /> <link-entity name="ccl1007_studentjourney" from="ccl1007_contactid" to="contactid"> <filter type="and"> <condition attribute="statecode" operator="eq" value="0" /> <filter type="or"> <condition attribute="ccl1007_sjapplicantdayattendedon" operator="last-x-months" value="12" /> <condition attribute="ccl1007_sjapplicantdayattendedon" operator="next-x-years" value="5" /> </filter> </filter> </link-entity> <filter> <condition attribute="contactid" operator="eq" value="234" /> </filter> </entity> </fetch>
需要获取所有位于<link-entity>节点下的<condition>节点,忽略其他位置的(比如最外层<filter>里的那个),目标是拿到指定的3个<condition>节点。
解决方案
下面提供两种在C#中实现的方法:
方法1:使用XPath
XPath可以直接定位到符合要求的节点,写法简洁:
using System.Xml; // 加载XML文档 XmlDocument doc = new XmlDocument(); doc.LoadXml("你的XML字符串"); // 或者用doc.Load("文件路径")加载本地文件 // 用XPath选择所有<link-entity>下的<condition>节点 XmlNodeList conditionNodes = doc.SelectNodes("//link-entity//condition"); // 遍历输出结果 foreach (XmlNode node in conditionNodes) { Console.WriteLine(node.OuterXml); // 输出节点的完整XML内容 }
//link-entity//condition的含义:
//link-entity:匹配文档中所有<link-entity>节点//condition:匹配该节点下所有层级的<condition>子节点(不管嵌套多少层<filter>)
方法2:使用LINQ to XML
如果项目中已经使用LINQ,这种方式更符合现代C#风格:
using System.Xml.Linq; // 加载XML XDocument doc = XDocument.Parse("你的XML字符串"); // 或者XDocument.Load("文件路径") // 查询所有<link-entity>下的<condition>节点 var conditionElements = doc.Descendants("link-entity") .Descendants("condition"); // 遍历输出 foreach (var element in conditionElements) { Console.WriteLine(element.ToString()); }
Descendants("link-entity")会找到所有<link-entity>节点,再调用Descendants("condition")就能获取该节点下所有层级的<condition>元素,自动忽略其他位置的节点。
这两种方法都能精准获取你需要的3个<condition>节点,不会包含外层<filter>里的那个节点。
内容的提问来源于stack exchange,提问作者cmcperillano03
相关产品推荐
相关产品推荐

