如何在C#中按Name和Num属性筛选指定XML节点?
问题:筛选XML中符合条件的节点内容
XML结构示例
<TacRef> <TacRefData Num="0"> <MainData> <Name>Name 1</Name> <PicName>PicName 1</PicName> </MainData> <CategoryData Num="0"> <CategoryTitle>General Information</CategoryTitle> <CategoryDescription>CategoryDescription 0</CategoryDescription> </CategoryData> <CategoryData Num="1"> <CategoryTitle>Dimensions</CategoryTitle> <CategoryDescription>CategoryDescription 1</CategoryDescription> </CategoryData> <RwrData> <Index>0</Index> <Image>0</Image> <SearchTone>0</SearchTone> <LockTone>0</LockTone> <Name>No Radar</Name> </RwrData> </TacRefData> <TacRefData Num="1"> <MainData> <Name>Name 1</Name> <PicName>PicName 1</PicName> </MainData> <CategoryData Num="0"> <CategoryTitle>General Information</CategoryTitle> <CategoryDescription>CategoryDescription 0</CategoryDescription> </CategoryData> <CategoryData Num="1"> <CategoryTitle>Dimensions</CategoryTitle> <CategoryDescription>CategoryDescription 1</CategoryDescription> </CategoryData> <RwrData> <Index>0</Index> <Image>0</Image> <SearchTone>0</SearchTone> <LockTone>0</LockTone> <Name>No Radar</Name> </RwrData> </TacRefData> </TacRef>
需求与现有代码
我需要获取所有Name节点内容包含"SA-",且对应**CategoryData节点Num属性为"4"**的Name值和CategoryDescription内容(示例XML中未包含Num="4"的CategoryData节点)。目前已能筛选出包含"SA-"的Name节点,但不知道如何定位到对应TacRefData下Num="4"的CategoryData节点,现有代码如下:
public class RefReader { private string _refFile = @"c:\....\TacRefDB.xml"; public XmlDocument xDoc; public RefReader() { xDoc = new XmlDocument(); xDoc.Load(_refFile); var nodes = xDoc.SelectNodes("TacRef/TacRefData"); foreach (XmlNode productNode in nodes) { var name = productNode["MainData"]["Name"].InnerXml; if (name.Contains("SA-")) { Console.WriteLine(name); // 如何获取当前productNode下Num="4"的CategoryData节点的CategoryDescription? } } } }
解决方案
方法1:使用XPath直接定位目标节点
利用XPath的属性筛选语法,直接在当前productNode下查询Num属性为"4"的CategoryData节点,代码简洁高效:
if (name.Contains("SA-")) { // 定位到当前TacRefData下Num="4"的CategoryData节点 var targetCategory = productNode.SelectSingleNode("CategoryData[@Num='4']"); if (targetCategory != null) { var description = targetCategory["CategoryDescription"].InnerXml; Console.WriteLine($"设备名称:{name},描述:{description}"); } else { Console.WriteLine($"设备名称:{name},未找到Num=4的分类数据"); } }
方法2:遍历CategoryData节点筛选
如果需要更直观的逻辑,可以遍历当前productNode下所有CategoryData节点,逐一判断Num属性:
if (name.Contains("SA-")) { foreach (XmlNode categoryNode in productNode.SelectNodes("CategoryData")) { var numAttr = categoryNode.Attributes["Num"]; if (numAttr != null && numAttr.Value == "4") { var description = categoryNode["CategoryDescription"].InnerXml; Console.WriteLine($"设备名称:{name},描述:{description}"); break; // 找到目标节点后退出循环,避免无效遍历 } } }
内容的提问来源于stack exchange,提问作者dandan21
相关产品推荐
相关产品推荐

