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

C#如何获取数量未知的disp属性列表?

问题:解析XML响应并输出所有disp开头的属性

场景说明

发送请求后收到的XML响应示例:

<?xml version="1.0" encoding="UTF-8"?>
<response result="0">
    <check result="0">
        <extras PRV_TXN_ID="538659" disp1="text1" disp2="text2" disp3="text3"/>
    </check>
</response>

需求

需要在控制台输出所有以disp开头的属性(属性数量不固定,可能是disp1到disp8中的任意组合,数量未知)。

现有请求与解析代码

public static XmlDocument postXMLData(string xml)
{
    var request = (HttpWebRequest)WebRequest.Create(Requests.url);
    byte[] bytes;
    bytes = System.Text.Encoding.ASCII.GetBytes(xml);
    request.ContentType = "text/xml; encoding='utf-8'";
    request.ContentLength = bytes.Length;
    request.Method = "POST";
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(bytes, 0, bytes.Length);
    requestStream.Close();
    HttpWebResponse response;
    response = (HttpWebResponse)request.GetResponse();

    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (var streamReader = new StreamReader(response.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            var result = new XmlDocument();
            result.LoadXml(responseText);
            return result;
        }
    }

    throw new Exception("что то не так");
}

解决方案

直接在原方法中添加解析disp属性的逻辑,在返回XmlDocument前完成控制台输出:

修改后的代码

public static XmlDocument postXMLData(string xml)
{
    var request = (HttpWebRequest)WebRequest.Create(Requests.url);
    byte[] bytes;
    bytes = System.Text.Encoding.ASCII.GetBytes(xml);
    request.ContentType = "text/xml; encoding='utf-8'";
    request.ContentLength = bytes.Length;
    request.Method = "POST";
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(bytes, 0, bytes.Length);
    requestStream.Close();
    HttpWebResponse response;
    response = (HttpWebResponse)request.GetResponse();

    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (var streamReader = new StreamReader(response.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            var result = new XmlDocument();
            result.LoadXml(responseText);
            
            // 定位extras节点并筛选disp开头的属性
            XmlNode extrasNode = result.SelectSingleNode("//extras");
            if (extrasNode != null && extrasNode.Attributes != null)
            {
                foreach (XmlAttribute attr in extrasNode.Attributes)
                {
                    if (attr.Name.StartsWith("disp", StringComparison.OrdinalIgnoreCase))
                    {
                        Console.WriteLine($"{attr.Name}: {attr.Value}");
                    }
                }
            }
            
            return result;
        }
    }

    throw new Exception("что то не так");
}

代码说明

  1. 用SelectSingleNode("//extras")在整个XML文档中定位<extras>节点;
  2. 遍历该节点的所有属性,通过StartsWith("disp")筛选目标属性,StringComparison.OrdinalIgnoreCase保证大小写不敏感匹配(不需要可去掉);
  3. 直接在控制台输出属性名和对应的值。

如果想把属性解析逻辑单独封装,可提取为辅助方法:

private static void PrintDispAttributes(XmlDocument xmlDoc)
{
    XmlNode extrasNode = xmlDoc.SelectSingleNode("//extras");
    if (extrasNode?.Attributes == null) return;
    
    foreach (XmlAttribute attr in extrasNode.Attributes)
    {
        if (attr.Name.StartsWith("disp"))
        {
            Console.WriteLine($"{attr.Name}: {attr.Value}");
        }
    }
}

随后在原方法中调用PrintDispAttributes(result);即可。

内容的提问来源于stack exchange,提问作者John Paul Johns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:30:59