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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:55:24