Как прочитать SecurityToken и значение подписи из запроса Soap

#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. Это решение действительно полезно, и я могу получить требуемые значения.