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

