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

如何使用XDocument获取和设置XML节点的值?附SOAP XML示例

使用XDocument操作SOAP XML节点值

嘿,我来帮你搞定用XDocument操作这个SOAP XML的节点值问题!首先要注意的是,你的XML里带了命名空间(比如S和wss对应的URI),这是关键——如果忽略命名空间,你根本找不到对应的节点。下面分获取和设置两部分来演示:

一、获取节点值

首先我们需要加载XML,并声明对应的命名空间,然后通过Descendants方法定位到目标节点并取值:

// 你的SOAP XML内容
string soapXml = @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""no""?> 
<S:Envelope xmlns:S=""http://schemas.xmlsoap.org/soap/envelope/""> 
    <S:Header> 
        <wss:Security xmlns:wss=""http://schemas.xmlsoap.org/ws/2002/12/secext""> 
            <wss:UsernameToken> 
                <wss:Username>username</wss:Username> 
                <wss:Password>password</wss:Password> 
                <wss:Nonce></wss:Nonce> 
                <wss:Created></wss:Created> 
            </wss:UsernameToken> 
        </wss:Security> 
    </S:Header>
</S:Envelope>";

// 加载XML到XDocument实例
XDocument doc = XDocument.Parse(soapXml);

// 声明XML里的两个命名空间
XNamespace sNs = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace wssNs = "http://schemas.xmlsoap.org/ws/2002/12/secext";

// 获取Username节点的值
string username = doc.Descendants(wssNs + "Username").FirstOrDefault()?.Value;

// 获取Password节点的值
string password = doc.Descendants(wssNs + "Password").FirstOrDefault()?.Value;

// 打印结果
Console.WriteLine($"当前Username: {username}");
Console.WriteLine($"当前Password: {password}");

说明:

  • Descendants(wssNs + "Username")会遍历XML中所有属于wss命名空间的Username节点,用FirstOrDefault()避免找不到节点时抛出空引用异常
  • 如果你的XML是从文件读取的,把XDocument.Parse(soapXml)换成XDocument.Load("你的文件路径.xml")即可

二、设置节点值

同样先定位到目标节点,然后直接修改它的Value属性即可,比如修改用户名密码、给Nonce和Created赋值:

// 给Username设置新值
var usernameNode = doc.Descendants(wssNs + "Username").FirstOrDefault();
if (usernameNode != null)
{
    usernameNode.Value = "my_new_username";
}

// 给Password设置新值
var passwordNode = doc.Descendants(wssNs + "Password").FirstOrDefault();
if (passwordNode != null)
{
    passwordNode.Value = "my_secure_password";
}

// 生成随机Nonce值(通常用GUID)
var nonceNode = doc.Descendants(wssNs + "Nonce").FirstOrDefault();
if (nonceNode != null)
{
    nonceNode.Value = Guid.NewGuid().ToString("N");
}

// 设置Created为当前UTC时间(符合SOAP标准格式)
var createdNode = doc.Descendants(wssNs + "Created").FirstOrDefault();
if (createdNode != null)
{
    createdNode.Value = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
}

// 输出修改后的XML,或者保存到文件
string updatedXml = doc.ToString();
Console.WriteLine(updatedXml);
// doc.Save("修改后的文件路径.xml");

说明:

  • 一定要先判断节点是否为null,避免空引用错误
  • 对于Nonce和Created这类安全相关的字段,建议按照SOAP WS-Security的规范来生成值(比如Nonce用随机字符串,Created用UTC时间)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:30:16