Understanding how to quote XML string in order to serialize using Python's ElementTree
Karim
kliateni at gmail.com
Sat Jan 9 18:30:48 EST 2016
Yes it changes your quotechar = "'" into quotechar = '"'
You should no more get the double quoting of the data string and no more
slicing step.
Karim
On 10/01/2016 00:15, Saran Ahluwalia wrote:
> Thank you for the feedback on this. I believe that the excel dialect
> includes just that:
>
> class excel(Dialect):
> delimiter = ','
> quotechar = '"'
> doublequote = True
> skipinitialspace = False
> lineterminator = '\r\n'
> quoting = QUOTE_MINIMAL
>
> On Sat, Jan 9, 2016 at 5:23 PM, Karim <kliateni at gmail.com
> <mailto:kliateni at gmail.com>> wrote:
>
>
>
> On 09/01/2016 21:54, kbtyo wrote:
>
> My specs:
>
> Python 3.4.3
> Windows 7
> IDE is Jupyter Notebooks
>
> What I have referenced:
>
> 1)
> http://stackoverflow.com/questions/1546717/python-escaping-strings-for-use-in-xml
>
> 2)
> http://stackoverflow.com/questions/7802418/how-to-properly-escape-single-and-double-quotes
>
> 3)http://stackoverflow.com/questions/4972210/escaping-characters-in-a-xml-file-with-python
>
>
> Here is the data (in CSV format) and script, respectively, (I
> have tried variations on serializing Column 'E' using both Sax
> and ElementTree):
>
> i)
>
> A,B,C,D,E,F,G,H,I,J
> "3","8","1","<Request TransactionID="3"
> RequestType="FOO"><InstitutionISO
> /><CallID>23</CallID><MemberID>12</MemberID><MemberPassword
> /><RequestData><AccountNumber>2</AccountNumber><AccountSuffix>85</AccountSuffix><AccountType>S</AccountType><MPIAcctType>Checking</MPIAcctType><TransactionCount>10</TransactionCount></RequestData></Request>","<Response
> TransactionID="2"
> RequestType="HoldInquiry"><ShareList>0000',0001,0070,</ShareList></Response>","1967-12-25
> 22:18:13.471000","2005-12-25 22:18:13.768000","2","70","0"
>
> ii)
>
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
> import os.path
> import sys
> import csv
> from io import StringIO
> import xml.etree.cElementTree as ElementTree
> from xml.etree.ElementTree import XMLParser
> import xml
> import xml.sax
> from xml.sax import ContentHandler
>
> class MyHandler(xml.sax.handler.ContentHandler):
> def __init__(self):
> self._charBuffer = []
> self._result = []
>
> def _getCharacterData(self):
> data = ''.join(self._charBuffer).strip()
> self._charBuffer = []
> return data.strip() #remove strip() if whitespace is
> important
>
> def parse(self, f):
> xml.sax.parse(f, self)
> return self._result
>
> def characters(self, data):
> self._charBuffer.append(data)
>
> def startElement(self, name, attrs):
> if name == 'Response':
> self._result.append({})
>
> def endElement(self, name):
> if not name == 'Response': self._result[-1][name] =
> self._getCharacterData()
>
> def read_data(path):
> with open(path, 'rU', encoding='utf-8') as data:
> reader = csv.DictReader(data, delimiter =',',
> quotechar="'", skipinitialspace=True)
> for row in reader:
> yield row
>
> if __name__ == "__main__":
> empty = ''
> Response = 'sample.csv'
> for idx, row in enumerate(read_data(Response)):
> if idx > 10: break
> data = row['E']
> print(data) # The before
> data = data[1:-1]
> data = ""'{}'"".format(data)
> print(data) # Sanity check
> # data = '<Response TransactionID="2"
> RequestType="HoldInquiry"><ShareList>0000',0001,0070,</ShareList></Response>'
> try:
> root = ElementTree.XML(data)
> # print(root)
> except StopIteration:
> raise
> pass
> # xmlstring = StringIO(data)
> # print(xmlstring)
> # Handler = MyHandler().parse(xmlstring)
>
>
> Specifically, due to the quoting in the CSV file (which is
> beyond my control), I have had to resort to slicing the string
> (line 51) and then formatting it (line 52).
>
> However the print out from the above attempt is as follows:
>
> "<Response TransactionID="2"
> RequestType="HoldInquiry"><ShareList>0000'
> <Response TransactionID="2"
> RequestType="HoldInquiry"><ShareList>0000
>
> File "<string>", line unknown
> ParseError: no element found: line 1, column 69
> Interestingly - if I assign the variable "data" (as in line
> 54) I receive this:
>
> File "<ipython-input-80-7357c9272b92>", line 56
> data = '<Response TransactionID="2"
> RequestType="HoldInquiry"><ShareList>0000',0001,0070,</ShareList></Response>'
> ^
> SyntaxError: invalid token
>
> I seek feedback and information on how to address utilizing
> the most Pythonic means to do so. Ideally, is there a method
> that can leverage ElementTree. Thank you, in advance, for your
> feedback and guidance.
>
>
> In fact to get rid of double quote simply create your csv reader
> like that:
>
> reader = csv.DictReader(data, dialect='excel', skipinitialspace=True)
>
> You should then don't need to slice data variable and reformat it.
>
> Karim
>
>
>
More information about the Python-list
mailing list