如何通过在linq中排除一些遵循一定条件的节点来生成xml文件
本文关键字:节点 条件 文件 xml linq 何通过 排除 | 更新日期: 2023-09-27 18:10:01
在以下xml数据中,我需要通过排除最后一个节点来读取整个xml数据,该节点也包含一些子节点。
<entity name="account">
<attribute name="name" />
<attribute name="accountnumber" />
<attribute name="primarycontactid" />
<attribute name="address1_city" />
<attribute name="telephone1" />
<attribute name="emailaddress1" />
<attribute name="accountid" />
<order attribute="name" descending="false" />
<filter type="and">
<condition attribute="statecode" operator="eq" value="0" />
</filter>
<filter type="or" isquickfindfields="1">
<condition attribute="name" operator="like" value="{0}" />
<condition attribute="accountnumber" operator="like" value="{0}" />
<condition attribute="emailaddress1" operator="like" value="{0}" />
<condition attribute="telephone1" operator="like" value="{0}" />
<condition attribute="telephone2" operator="like" value="{0}" />
</filter>
</entity>
现在如何分别得到以下数据
<filter type="or" isquickfindfields="1">
<condition attribute="name" operator="like" value="{0}" />
<condition attribute="accountnumber" operator="like" value="{0}" />
<condition attribute="emailaddress1" operator="like" value="{0}" />
<condition attribute="telephone1" operator="like" value="{0}" />
<condition attribute="telephone2" operator="like" value="{0}" />
</filter>
和
<filter type="and">
<condition attribute="statecode" operator="eq" value="0" />
</filter>
和最后
<attribute name="name" />
<attribute name="accountnumber" />
<attribute name="primarycontactid" />
<attribute name="address1_city" />
<attribute name="telephone1" />
<attribute name="emailaddress1" />
<attribute name="accountid" />
<order attribute="name" descending="false" />
使用XElement.Parse()
方法将xml加载到XElement
var root = XElement.Parse("your-xml-string");
使用以下查询获取或过滤器:
var orFilter = root.Descendants("filter")
.FirstOrDefault(e => e.Attribute("type").Value == "or");
和过滤器也是如此:
var andFilter = root.Descendants("filter")
.FirstOrDefault(e => e.Attribute("type").Value == "and");
要获取属性元素:
var attributeElements = root.Elements()
.Where(e => e.Name != "filter");
注意不要在上面的查询中使用Descendants()
方法,因为它也会返回过滤器元素的后代。