OrderedDict

Peter Otten __peter__ at web.de
Wed May 18 05:28:10 EDT 2016


silver0346 at gmail.com wrote:

> Hi all,
> 
> I have a understanding problem with return values from xmltodict.
> 
> I have a xml file. Content:
> 
> <?xml version="1.0" encoding="utf-8" ?>
> <profiles>
>   <profile id='visio02' revision='2015051501' >
>   <package package-id='0964-gpg4win' />
>   </profile>
> </profiles>
> <!--
> -->
> 
> With code
> 
> __f_name = '<path_to_file>'
> with open(__f_name) as __fd:
>     __doc = xmltodict.parse(__fd.read())
>    
> __doc
> 
> I get
> 
> OrderedDict([(u'profiles', OrderedDict([(u'profile', OrderedDict([(u'@id',
> u'visio02'), (u'@revision', u'2015051501'), (u'package',
> OrderedDict([(u'@package-id', u'0964-gpg4win')]))]))]))])
> 
> If I use
> 
> __doc['profiles']['profile']['package'][0]['@package-id']
> 
> I get
> 
> Traceback (most recent call last):
>   File "<input>", line 1, in <module>
> KeyError: 0
> 
> If I change xml file like this:
> 
> <?xml version="1.0" encoding="utf-8" ?>
> <profiles>
>   <profile id='visio02' revision='2015051501' >
>   <package package-id='0964-gpg4win' />
>   <package package-id='0965-gpg4win' />
>   </profile>
> </profiles>
> 
> and run code from above the result is:
> 
> OrderedDict([(u'profiles', OrderedDict([(u'profile', OrderedDict([(u'@id',
> u'visio02'), (u'@revision', u'2015051501'), (u'package',
> [OrderedDict([(u'@package-id', u'0964-gpg4win')]),
> OrderedDict([(u'@package-id', u'0965-gpg4win')])])]))]))])
> 
> No prints __doc['profiles']['profile']['package'][0]['@package-id']:
> 
> u'0964-gpg4win'
> 
> Can everybody explain this?

Not everybody, but Chris and a few others can ;)
 
> Many thanks in advance

I don't see an official way to pass a custom dict type to the library, 
but if you are not afraid to change its source code the following patch
will allow you to access the value of dictionaries with a single entry as d[0]:

$ diff -u py2b_xmltodict/local/lib/python2.7/site-packages/xmltodict.py py2_xmltodict/local/lib/python2.7/site-packages/xmltodict.py
--- py2b_xmltodict/local/lib/python2.7/site-packages/xmltodict.py       2016-05-18 11:18:44.000000000 +0200
+++ py2_xmltodict/local/lib/python2.7/site-packages/xmltodict.py        2016-05-18 11:11:13.417665697 +0200
@@ -35,6 +35,13 @@
 __version__ = '0.10.1'
 __license__ = 'MIT'
 
+_OrderedDict = OrderedDict
+class OrderedDict(_OrderedDict):
+    def __getitem__(self, key):
+        if key == 0:
+            [result] = self.values()
+            return result
+        return _OrderedDict.__getitem__(self, key)
 
 class ParsingInterrupted(Exception):
     pass





More information about the Python-list mailing list