2012-01-04 102 views
1
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:tns="http://ttdev.com/ss" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" 
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd" 
    name="SecureService" targetNamespace="http://ttdev.com/ss"> 



     <wsp:Policy wsu:Id="p0"> 
     <sp:SignedParts> 
     <sp:Body /> 
     </sp:SignedParts> 
     </wsp:Policy> 

    <wsp:Policy wsu:Id="p1"> 
     <sp:SignedParts> 
     <sp:Body /> 
     </sp:SignedParts> 
     </wsp:Policy> 

    <wsp:Policy wsu:Id="p2"> 
     <sp:SignedParts> 
     <sp:Body /> 
     </sp:SignedParts> 
     </wsp:Policy> 

    <wsdl:binding name="SecureServiceSOAP" type="tns:SecureService"> 

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 

    <wsdl:operation name="concat"> 
    <wsp:PolicyReference URI="#p1" wsdl:required="true" /> 
    <soap:operation soapAction="http://ttdev.com/ss/concat" /> 
    <wsdl:input> 
    <soap:body parts="concatRequest" use="literal" /> 
    </wsdl:input> 
    <wsdl:output> 
    <soap:body parts="concatResponse" use="literal" /> 
    </wsdl:output> 
    </wsdl:operation> 

    </wsdl:binding> 

    <wsdl:service name="SecureService"> 
    <wsdl:port binding="tns:SecureServiceSOAP" name="SecureServiceSOAP"> 
    <soap:address location="http://localhost:8080/axis2/services/SecureService" /> 
    </wsdl:port> 
    </wsdl:service> 
    </wsdl:definitions> 

这个WSDL包含一个政策部分和操作名称和标签WSP的URI属性的基础上的操作部分 所以:PolicyReference 我想取整个策略XML部分从这个WSDL复杂的LINQ查询从WSDL文件获取政策

<wsp:Policy wsu:Id="p1"> 
    <sp:SignedParts> 
    <sp:Body /> 
    </sp:SignedParts> 
    </wsp:Policy> 

可以有很多政策,但其ID与政策refence其操作的名字我通过,这项政策我想的URI值相匹配。

你可以帮我取得政策的XML部分。

pOperationName变量CONCAT然后输出字符串的某一个合格值应如下:

<wsp:Policy wsu:Id="p1"> 
<sp:SignedParts> 
<sp:Body /> 
</sp:SignedParts> 
</wsp:Policy> 

使用下面的代码完成了(但此查询工作只有一个WSP:政策标签存在如何让它工作,即使多个WSP:策略标记在WSDL介绍)

private string GetPolicy() 
     { 
      XDocument wsdlDocument = XDocument.Load(_wsdlPath); 

      XName operationElementName = XName.Get("operation", "http://schemas.xmlsoap.org/wsdl/"); 
      XName policyReferenceElementName = XName.Get("PolicyReference", "http://schemas.xmlsoap.org/ws/2004/09/policy"); 
      XName policyElementName = XName.Get("Policy", "http://schemas.xmlsoap.org/ws/2004/09/policy"); 
      XName idAttributeName = XName.Get("Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd"); 

      var operationPolicy = from operation in wsdlDocument.Descendants(operationElementName) 
            where operation.Attribute("name").Value == _operationSelected //"concat" 
            from policyReference in operation.Descendants(policyReferenceElementName) 
            where policyReference.Attribute("URI").Value.StartsWith("#") 
            let uri = policyReference.Attribute("URI").Value.Substring(1) 
            from policy in wsdlDocument.Descendants(policyElementName) 
            where policy.Attribute(idAttributeName).Value == uri    
            select policy.ToString(); 

      string temp = operationPolicy.FirstOrDefault(); 
      return temp; 
     } 
+0

这个问题在[this one]之后仍然相关(http://stackoverflow.com/questions/8724333/fetching-xml-through-linq)? – 2012-01-04 20:41:35

回答

0

XDocument wsdlDocument = XDocument.Load(_wsdlPath);

 XName operationElementName = XName.Get(Constants.OPERATION, Constants.WSDL_NS); 
     XName policyReferenceElementName = XName.Get(Constants.POLICY_REFERENCE, Constants.NamespacePath.POLICY); 
     XName policyElementName = XName.Get(Constants.POLICY, Constants.NamespacePath.POLICY); 
     XName idAttributeName = XName.Get("Id", Constants.NamespacePath.WSSECURITY); 


     var uriNo = from operation in wsdlDocument.Descendants(operationElementName) 
        where operation.HasAttributes && operation.Attribute(Constants.NAME).Value == _operationSelected 
        from policyReference in operation.Descendants(policyReferenceElementName) 
        where policyReference.HasAttributes && policyReference.Attribute(Constants.URI).Value.StartsWith(Constants.HASH) 
        select policyReference.Attribute(Constants.URI).Value.Substring(1); 

     string uritemp = uriNo.FirstOrDefault().ToString(); 

     var operationPolicy = from policy in wsdlDocument.Descendants(policyElementName) 
           where policy.HasAttributes && policy.Attribute(idAttributeName).Value == uritemp 
           select policy; 

     string temp = operationPolicy.FirstOrDefault().ToString(); 
     return temp;