Search code examples
pythonjbosslxmlsoapui

Editing existing XML file and sending post via Jboss


I have the following python method which runs though an xml file and parses it, and TRIES to edit a field:

    import requests
import xml.etree.ElementTree as ET
import random

def runThrougheTree():
    #open xml file
    with open("testxml.xml") as xml:
        from lxml import etree
        #parse
        parser = etree.XMLParser(strip_cdata=True, recover=True)
        tree = etree.parse("testxml.xml", parser)
        root= tree.getroot()
        #ATTEMPT to edit field - will not work as of now
        for ci in root.iter("CurrentlyInjured"):
            ci.text = randomCurrentlyInjured(['sffdgdg', 'sdfsdfdsfsfsfsd','sfdsdfsdfds'])
        #Overwrite initial xml file with new fields  - will not work as of now
        etree.ElementTree(root).write("testxml.xml",pretty_print=True, encoding='utf-8', xml_declaration=True)

        #send post (Jboss)
        requests.post('http://localhost:9000/something/RuleServiceImpl', data="testxml.xml)



def randomCurrentlyInjured(ran):
    random.shuffle(ran)
    return ran[0]







#-----------------------------------------------
if __name__ == "__main__":
    runThrougheTree()

Edited XML file:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rule="http://somewebsite.com/" xmlns:ws="http://somewebsite.com/" xmlns:bus="http://somewebsite.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:Respond>
         <ws:busMessage>
            <bus:SomeRef>insertnumericvaluehere</bus:SomeRef>
            <bus:Content><![CDATA[<SomeDef>
  <SomeType>ABCD</Sometype>
  <A_Message>
      <body>
        <AnonymousField>
          <RefIndicator>1111111111111</RefIndicator>
          <OneMoreType>HIJK</OneMoreType>
          <CurrentlyInjured>ABCDE</CurentlyInjured>
        </AnonymousField>
      </body>
  </A_Message>
</SomeDef>]]></bus:Content>
            <bus:MessageTypeId>somenumericvalue</bus:MessageTypeId>
         </ws:busMessage>
      </ws:Respond>
   </soapenv:Body>
</soapenv:Envelope>

Issues:

  1. The field is not being edited.
  2. Jboss error: Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog.

Note: I have ensured that there is no characters prior to first xml tag.


Solution

  • In the end, I was unable to use lxml, elementtree to edit the fields/post to Jboss as:

    1. I had CDATA in the xml as mzjn pointed out in the comments

    2. Jboss did not like the request after it had been parsed, even when the CDATA tags were removed.

    Workaround/Eventual SOlution: I was able to (somewhat tediously) use .replace() in my script to edit the plaintext successfully, and then send the POST via Jboss. I hope this helps someone else someday!