Сложный запрос LINQ для извлечения политики из файла WSDL - PullRequest
1 голос
/ 04 января 2012
 <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 содержит раздел политики и раздел операций Таким образом, на основе имени операции и атрибута URI тега wsp: PolicyReference Я хочу получить всю часть Policy XMl из этого WSDl

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

Может быть много политик, но чей ID совпадает со значением URI ссылки на политику, чье имя операции я передаю, ту политику, которую я хочу.

Можете ли вы помочь мне получить часть политики XML.

Если какое-то одно значение передачи pOperationName , переменная как concat , тогда выходная строка должна быть следующей:

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

Выполнено с использованием следующего кода (но этот запрос работает только при наличии одного тега wsp: policy как заставить его работать, даже если в WSDL ) присутствует несколько тегов wsp: policy

 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;
        }

1 Ответ

0 голосов
/ 06 января 2012

XDocument wsdlDocument = XDocument. Загрузка (_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;
...