代码之家  ›  专栏  ›  技术社区  ›  Sailing Judo

如何通过LINQ-to-XML从XML中获取用户名?

  •  1
  • Sailing Judo  · 技术社区  · 14 年前

     <?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>user@mycompany.net</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>
    

    我只需要Username元素的内容。

    我试过这个。。。

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

    ... 但没有结果。

    当我试着使用wsse:用户名令牌“和”wsse:用户名“我得到一个例外,说冒号是不合法的。

    (我知道我可能只需要regex这个名字,但是如果我需要在将来的某个时候获取其他数据,我想这样会更有效。)

    4 回复  |  直到 14 年前
        1
  •  2
  •   Community kfsone    7 年前

    冒号前面的部分是一个名称空间,我从一个类似的问题中找到了这个答案。

    Linq to XML with Namespace

        2
  •  2
  •   Jerod Venema    14 年前

    高度地 反直觉,但它是这样工作的:

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

    从中的项xdoc.后代("{ http://schemas.xmlsoap.org/soap/envelope/ }用户名令牌“)

    但我从没试过。

    More details here.

        3
  •  2
  •   Neil Bostrom    14 年前

    这取决于那些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 to XML中名称空间的详细信息: http://msdn.microsoft.com/en-us/library/bb387069.aspx

        4
  •  1
  •   eflorico    14 年前

    必须在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")
                    };