2010-09-07 2 views
1

Мне нужно записать имя пользователя, использующее веб-службу ASP.NET. Для этого я создал SoapExtension, который захватывает входящий конверт Soap и преобразует его в XDocument. Проблема в том, что я ничего не знаю о LINQ to XML, и примеры, которые я просмотрел, похоже, не работают с конвертом SOAP.Как я могу получить имя пользователя из XML через LINQ to XML?

SOAP-сообщение выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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"> 
    <soap:Header> 
    <wsa:Action>http://www.company.net/2009/09/17/wriapp/GetConfigInfo</wsa:Action> 
    <wsa:MessageID>urn:uuid:da599d3d-1df5-4460-8987-8ccd75b87cfe</wsa:MessageID> 
    <wsa:ReplyTo><wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address></wsa:ReplyTo> 
    <wsa:To>urn:Company:Wri:Tracking:1.0</wsa:To> 
    <wsse:Security soap:mustUnderstand="1"> 
     <wsu:Timestamp wsu:Id="Timestamp-efb2ad77-7822-43d9-86d6-0cbfbf0ed262"> 
      <wsu:Created>2010-09-07T13:31:20Z</wsu:Created> 
      <wsu:Expires>2010-09-07T13:36:20Z</wsu:Expires> 
     </wsu:Timestamp> 
     <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-c51f6c78-555b-420c-ba79-402d75f24d5e"> 
     <wsse:Username>[email protected]</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password1</wsse:Password> 
     <wsse:Nonce>xO+f8fJgh8zzxPi6JJMUag==</wsse:Nonce> 
     <wsu:Created>2010-09-07T13:31:20Z</wsu:Created> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    </soap:Header> 
    <soap:Body> 
    <GetConfigInfo xmlns="http://www.company.net/2009/09/17/wriapp" /> 
    </soap:Body> 
</soap:Envelope> 

Все, что мне нужно, это содержание Логин элемента.

Я попытался это ...

var xdoc = XDocument.Parse(xml, LoadOptions.None); 
var userName = from item in xdoc.Descendants("UsernameToken") 
       select new 
       { 
        UserName = item.Element("UserName") 
       }; 

... но не получают никаких результатов.

Когда я попытался использовать «wsse: UsernameToken» и «wsse: Username», я получаю исключение, в котором говорится, что двоеточие не является законным.

Любые советы о том, как получить эту информацию?

(я знаю, что, вероятно, может просто REGEX имя, но если мне нужно, чтобы захватить другие данные в какой-то момент в будущем, то это будет более эффективным, таким образом, я думаю.)

ответ

2

деталь в передней части двоеточие - пространство имен, зная это, я нашел этот ответ по аналогичному вопросу.

Linq to XML with Namespace

+0

У нескольких человек был полезный ответ, но это был первый (по словам «самый старый» вид), поэтому он получил ответ. Все они получили +1. –

2

Вам необходимо создать пространство имен и использовать его. Это высоко счетчик интуитивно, но это, как это работает:

XNamespace ns = "http://schemas.xmlsoap.org/soap/envelope/"; 
from item in xdoc.Descendants(ns + "UsernameToken") 
...etc... 

... и вы должны сделать, что для любого элемента, который имеет префикс.

Я думаю, вы также можете использовать фигурные скобки ({}) в качестве обертки вокруг URI, например:

из пункта в xdoc.Descendants ("{} http://schemas.xmlsoap.org/soap/envelope/ UsernameToken")

но я Я никогда не пробовал.

More details here.

2

Это вниз к пространствам имен для этих элементов XML. Вы должны добавить это к вашему запросу. Я не в точке, чтобы попробовать это, но что-то вдоль линий:

XNamespace wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

var xdoc = XDocument.Parse(xml, LoadOptions.None); 
var userName = from item in xdoc.Descendants(wsu + "UsernameToken") 
       select new 
       { 
        UserName = item.Element(wsu + "UserName") 
       }; 

Для получения дополнительной информации о пространствах имен в LINQ к XML: http://msdn.microsoft.com/en-us/library/bb387069.aspx

1

Вы должны включить все пространство имен в LINQ:

XNamespace wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

var xdoc = XDocument.Parse(xml, LoadOptions.None); 
var userName = from item in xdoc.Descendants(wsse + "UsernameToken") 
       select new 
       { 
        UserName = item.Element(wsse + "UserName") 
       };