You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的DataSet/DataView中筛选带指定属性的XML子节点

如何修改dataGet()方法筛选带指定属性的XML节点

嘿,我来帮你搞定这个XML节点筛选的需求~结合你之前用XPath的经验,我给你两种实用的修改方案,你可以根据需求选:

先明确你的目标XML结构

<parent> 
  <child> 
    <node id="1" attribute="True"> </node> 
    <node id="2" attribute="False"> </node> 
  </child> 
</parent>

方案1:用DataView的RowFilter(简单直接)

当你用DataSet.ReadXml()读取XML时,节点的属性会自动转成DataTable的列,比如<node>的id和attribute会变成node表的两列。我们直接用RowFilter就能筛选:

private DataView dataGet(string filterAttribute, string filterValue) {
    DataView functionReturnValue = null;
    DataSet dsListing = new DataSet();
    // 加载XML文件
    dsListing.ReadXml(MapPath("~/pathToXml.xml"));

    // 注意:DataSet会把<node>节点解析成名为"node"的DataTable
    DataTable nodeTable = dsListing.Tables["node"];
    if (nodeTable != null) {
        DataView dvListing = nodeTable.DefaultView;
        // 设置筛选条件,比如"id = '1'"或者"attribute = 'True'"
        dvListing.RowFilter = $"{filterAttribute} = '{filterValue}'";
        functionReturnValue = dvListing;
    }

    return functionReturnValue;
}

调用示例:

  • 筛选id="1"的节点:dataGet("id", "1")
  • 筛选attribute="True"的节点:dataGet("attribute", "True")

方案2:用你熟悉的XPath筛选(灵活适配复杂场景)

如果你习惯用XPath语法,我们可以先筛选出符合条件的节点,再转成DataView,完美适配你之前的使用习惯:

private DataView dataGet(string xpathExpression) {
    DataView functionReturnValue = null;
    DataSet dsListing = new DataSet();
    XmlDocument xmlDoc = new XmlDocument();

    // 加载原始XML
    xmlDoc.Load(MapPath("~/pathToXml.xml"));
    // 用XPath筛选目标节点
    XmlNodeList filteredNodes = xmlDoc.SelectNodes(xpathExpression);

    // 把筛选后的节点包装成可被DataSet读取的XML结构
    XmlDocument filteredXml = new XmlDocument();
    XmlElement root = filteredXml.CreateElement("filteredNodes");
    filteredXml.AppendChild(root);

    foreach (XmlNode node in filteredNodes) {
        // 导入节点到新XML文档
        XmlNode importedNode = filteredXml.ImportNode(node, true);
        root.AppendChild(importedNode);
    }

    // 加载筛选后的XML到DataSet
    using (StringReader sr = new StringReader(filteredXml.OuterXml)) {
        dsListing.ReadXml(sr);
    }

    // 返回筛选后的DataView
    if (dsListing.Tables.Count > 0) {
        functionReturnValue = dsListing.Tables[0].DefaultView;
    }

    return functionReturnValue;
}

调用示例:

  • 筛选id="1"的节点:dataGet("parent/child/node[@id='1']")
  • 筛选attribute="True"的节点:dataGet("parent/child/node[@attribute='True']")

内容的提问来源于stack exchange,提问作者hsobhy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:48