Это будет сделано
var elements = settings.DescendantNodes().OfType<XText>().Where(p => p.Value.StartsWith("{") && p.Value.EndsWith("}"));
foreach (var node in elements)
{
// This is an example of manipulation. It will simply remove the {}
node.Value = node.Value.Substring(1, node.Value.Length - 2);
}
Вы можете переместить условие Where
непосредственно в цикл for, например
var elements = settings.DescendantNodes().OfType<XText>();
foreach (var node in elements.Where(p => p.Value.StartsWith("{") && p.Value.EndsWith("}")))
{
// This is an example of manipulation. It will simply remove the {}
node.Value = node.Value.Substring(1, node.Value.Length - 2);
}
Инструкция по поиску XText
узлов из Значение XElement в C #
Обратите внимание, что вам необходимо добавить отсутствующие пространства имен:
xmlns:wsse='something' xmlns:wsa='somethingelse' xmlns:wsu='somethingelseelse'
или XElement.Parse
сломается;
Если вы хотите обновить один элемент, имя которого вам известно:
XNamespace wsa = "somethingelse"; // Here you must put the namespace!
var textElement = settings.Descendants(wsa + "MessageID").Single(); // If there is only one Message ID to change (0 or > 1 MessageID will make Single throw), .First() if you are only interested in the first one
textElement.Value = "MessageID"; // Changed!
или
var textElements = settings.Descendants(wsa + "MessageID") // If there are multipleMessage ID to change
foreach (var textElement in textElements)
{
textElement.Value = "MessageID"; // Changed!
}
Имейте в виду, что эти варианты будут изменять первый / все wsa: MessageID, игнорируя их положение.
или, если вы знаете точный «путь» к вашему узлу, используйте что-то вроде
var textElements = settings.Elements(name1).Elements(name2)...
, а затем используйте Single()
, .First()
илиforeach
Небольшой пример кода:
XElement settings = XElement.Parse(
@"<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' 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>");
var soapenv = settings.GetNamespaceOfPrefix("soapenv");
var wsa = settings.GetNamespaceOfPrefix("wsa");
var wsse = settings.GetNamespaceOfPrefix("wsse");
var wsu = settings.GetNamespaceOfPrefix("wsu");
XElement username = settings.Elements(soapenv + "Header").Elements(wsse + "Security").Elements(wsse + "UsernameToken").Elements(wsse + "Username").Single();
Console.WriteLine(username);
username.Value = "NewValue";
Console.WriteLine(username);