如何在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
相关产品推荐
相关产品推荐

