如何通过在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" />

如何通过在linq中排除一些遵循一定条件的节点来生成xml文件

使用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()方法,因为它也会返回过滤器元素的后代。