#c# #xml #linq #soap
#c# #xml #linq #soap
Вопрос:
У меня записан запрос soap
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">http://tempuri.org/IService/GetAccountsData</a:Action>
<h:SecurityToken xmlns:h="http://tempuri.org/">SEC00001</h:SecurityToken>
<a:MessageID>urn:uuid:d54052d7-fed7-40f4-9b3f-f857d0804ffb</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
</s:Header>
<s:Body>
<CustomerCredential xmlns="http://tempuri.org/">
<CustomerID>C001</CustomerID>
<RuleId>2.1</RuleId>
<Signature i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
</CustomerCredential>
</s:Body>
</s:Envelope>
Мне нужно прочитать SecurityToken и значение подписи в c #.
Я пытаюсь использовать приведенный ниже код, но не могу прочитать значение SecurityToken и подписи.
XNamespace ns = doc.Root.Name.Namespace;
var elements = from c in doc.Descendants(ns "Header")
select c;
Пожалуйста, оставьте свой комментарий.
Ответ №1:
Я бы предложил следующее решение с использованием выражений XPath. Рассмотрим этот код :
string filename = "SOAP.xml";
XmlDocument document = new XmlDocument();
document.Load(filename);
XPathNavigator navigator = document.CreateNavigator();
// use XmlNamespaceManager to resolve ns prefixes
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("h", "http://tempuri.org/");
// use XPath expression to select XML nodes
XPathNodeIterator nodes = navigator.Select("//h:SecurityToken",manager);
if ( nodes.MoveNext() )
Console.WriteLine(nodes.Current.ToString());
else
Console.WriteLine("Empty Element");
// and now for the Signature Element, without ns prefix
nodes = navigator.Select("//Signature", manager);
if (nodes.MoveNext())
Console.WriteLine(nodes.Current.ToString());
else
Console.WriteLine("Empty Element");
Для дальнейшего чтения см. Также Документы MSDN для class XPathNavigator http://msdn.microsoft.com/en-us/library/6k4x060d.aspx
Комментарии:
1. Я могу прочитать значение «SecurityToken» и «Signature», используя этот код. Можем ли мы прочитать пространство имен из самого файла soap вместо
manager.AddNamespace("h", "http://tempuri.org/");
2. Вы можете выбрать узел, не ссылаясь на его префикс ns, следующим образом:
XPathNodeIterator nodes = navigator.Select("//*[local-name() = 'SecurityToken']", manager);
если вам все еще нужно само имя ns, вы можете получить его таким образом :nodes.Current.NamespaceURI
3. Это решение действительно полезно, и я могу получить требуемые значения.