Right way for handling xsd:any response with zeep












0















I'm using zeep for retrieving data from SOAP service. In my case response is an xsd:any and zeep have no idea what is it, so it just returns lxml.element (explanation on github)



What is the best way to handle this case?



This is how I'm trying to do it now:



from io import StringIO
import xml.etree.ElementTree as ET

# define a couple of helpers

def strip_namespaces(xml):
"""
parses raw xml and removes namespaces from tags.
"""
iterable = ET.iterparse(StringIO(xml))
for _, el in iterable:
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1] # strip all namespaces
root = iterable.root
return root

def element_to_dict(element):
"""converts lxml object into python dict"""
return (element.tag,
dict(map(element_to_dict, element)) or element.text)

with client.settings(raw_response=True): # ask zeep to don't parse response
result = client.service.Method(argument)

el = strip_namespaces(result.text)
_, response_dict = element_to_dict(el)
print(response_dict)


It works (I guess), but looks a bit verbose and fragile.
Is there a more "pythonic" way?










share|improve this question





























    0















    I'm using zeep for retrieving data from SOAP service. In my case response is an xsd:any and zeep have no idea what is it, so it just returns lxml.element (explanation on github)



    What is the best way to handle this case?



    This is how I'm trying to do it now:



    from io import StringIO
    import xml.etree.ElementTree as ET

    # define a couple of helpers

    def strip_namespaces(xml):
    """
    parses raw xml and removes namespaces from tags.
    """
    iterable = ET.iterparse(StringIO(xml))
    for _, el in iterable:
    if '}' in el.tag:
    el.tag = el.tag.split('}', 1)[1] # strip all namespaces
    root = iterable.root
    return root

    def element_to_dict(element):
    """converts lxml object into python dict"""
    return (element.tag,
    dict(map(element_to_dict, element)) or element.text)

    with client.settings(raw_response=True): # ask zeep to don't parse response
    result = client.service.Method(argument)

    el = strip_namespaces(result.text)
    _, response_dict = element_to_dict(el)
    print(response_dict)


    It works (I guess), but looks a bit verbose and fragile.
    Is there a more "pythonic" way?










    share|improve this question



























      0












      0








      0








      I'm using zeep for retrieving data from SOAP service. In my case response is an xsd:any and zeep have no idea what is it, so it just returns lxml.element (explanation on github)



      What is the best way to handle this case?



      This is how I'm trying to do it now:



      from io import StringIO
      import xml.etree.ElementTree as ET

      # define a couple of helpers

      def strip_namespaces(xml):
      """
      parses raw xml and removes namespaces from tags.
      """
      iterable = ET.iterparse(StringIO(xml))
      for _, el in iterable:
      if '}' in el.tag:
      el.tag = el.tag.split('}', 1)[1] # strip all namespaces
      root = iterable.root
      return root

      def element_to_dict(element):
      """converts lxml object into python dict"""
      return (element.tag,
      dict(map(element_to_dict, element)) or element.text)

      with client.settings(raw_response=True): # ask zeep to don't parse response
      result = client.service.Method(argument)

      el = strip_namespaces(result.text)
      _, response_dict = element_to_dict(el)
      print(response_dict)


      It works (I guess), but looks a bit verbose and fragile.
      Is there a more "pythonic" way?










      share|improve this question
















      I'm using zeep for retrieving data from SOAP service. In my case response is an xsd:any and zeep have no idea what is it, so it just returns lxml.element (explanation on github)



      What is the best way to handle this case?



      This is how I'm trying to do it now:



      from io import StringIO
      import xml.etree.ElementTree as ET

      # define a couple of helpers

      def strip_namespaces(xml):
      """
      parses raw xml and removes namespaces from tags.
      """
      iterable = ET.iterparse(StringIO(xml))
      for _, el in iterable:
      if '}' in el.tag:
      el.tag = el.tag.split('}', 1)[1] # strip all namespaces
      root = iterable.root
      return root

      def element_to_dict(element):
      """converts lxml object into python dict"""
      return (element.tag,
      dict(map(element_to_dict, element)) or element.text)

      with client.settings(raw_response=True): # ask zeep to don't parse response
      result = client.service.Method(argument)

      el = strip_namespaces(result.text)
      _, response_dict = element_to_dict(el)
      print(response_dict)


      It works (I guess), but looks a bit verbose and fragile.
      Is there a more "pythonic" way?







      python zeep






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 15 '18 at 14:38







      NobbyNobbs

















      asked Nov 15 '18 at 14:33









      NobbyNobbsNobbyNobbs

      3631314




      3631314
























          0






          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53321731%2fright-way-for-handling-xsdany-response-with-zeep%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53321731%2fright-way-for-handling-xsdany-response-with-zeep%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Florida Star v. B. J. F.

          Danny Elfman

          Retrieve a Users Dashboard in Tumblr with R and TumblR. Oauth Issues