使用 LINQ to XML 更新元素?
我有以下 XML,但我很难弄清楚如何使用 LINQ to XML 直接更新元素:
XElement settings = XElement.Parse (
@"<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:wsa='http://schemas.xmlsoap.org/ws/2004/08/addressing'
xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand='1'>
<wsse:UsernameToken wsu:Id='UsernameToken-72135529'>
<wsse:Username>{USERNAME}</wsse:Username>
<wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>{PASSWORD}</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
<wsa:MessageID>{MESSAGEID}</wsa:MessageID>
<wsa:To>{TO}</wsa:To>
<wsa:Action>{ACTION}</wsa:Action>
<wsa:From>
<wsa:Address>{ADDRESS}</wsa:Address>
</wsa:From>
</soapenv:Header>
<soapenv:Body>
{BODY}
</soapenv:Body>
</soapenv:Envelope>");
例如,在上面,我想访问具有占位符值 {} 并更新文本。在这种情况下执行
XElement.Parse()
是否正确?我很可能首先将其加载到 XDocument
中,然后更新元素。另外,如何更新属性,例如 Password
上的 Type 属性?
尝试获取用户名,但它说这是一个 InvalidOperationException。
XNamespace xmlns = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace wsa = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
XNamespace wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
XNamespace wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
var textElement = settings.Elements(xmlns + "Envelope").
Elements(xmlns + "Header").
Elements(wsse + "Security").
Elements(wsse + "UsernameToken").
Elements(wsse + "Username").Single();
另外,如果我知道元素的确切位置,或者如果我想更新或删除 xmlns:wsa,那么使用 XPath 是否看起来更简单,这将如何实现?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这样就可以了。
您可以直接在 for 循环中移动
Where
条件,例如查找
XText
节点的指令来自 C# 中的 XElement 值请注意,您需要添加缺少的命名空间:
否则
XElement.Parse
将休息;如果您想更新您知道名称的单个元素:
或
请注意,这些变体将更改第一个/所有 wsa:MessageID,忽略它们的位置。
或者,如果您知道节点的确切“路径”,请使用类似的内容
,然后使用
Single()
、.First()
或foreach< /code>
一个小示例代码:
This will do it
You could move the
Where
condition directly in the for cycle, likeThe instruction for finding
XText
nodes are from XElement value in C#Note that you'll need to add the missing namespaces:
or the
XElement.Parse
will break;If you want to update a single element of which you know the name:
or
Be aware that these variants will change the first/all the wsa:MessageID, ignoring their position.
or if you know the exact "path" to your node, use something like
and then use the
Single()
, the.First()
or theforeach
A small sample code:
我还发现我可以只使用本地名称,而不必通过执行以下操作来声明名称空间:
I also found out that I can just use the local names without having to declare the namespaces by doing the following: