[libvirt] [test-API][PATCH] Fix xml parser problem when node have both attribute and value

Guannan Ren gren at redhat.com
Mon Aug 6 03:06:38 UTC 2012


On 08/02/2012 06:25 PM, Wayne Sun wrote:
>    When xml node have both attribute and value at first level, the parser
>    will broke. After fix, the node key will have a dictionary with both
>    value and attr inside. For example, the xml node:
>    <capacity unit='bytes'>536870912000</capacity>
>    will be parsed into:
>    {u'capacity': {'attr': {u'unit': u'bytes'}, 'value': u'536870912000'}}
>
>    Also when fetch the attribute key, should use a new param (attrkey)
>    other than exist key in outside loop.
>
> Signed-off-by: Wayne Sun <gsun at redhat.com>
> ---
>   utils/xml_parser.py |   22 +++++++++++++++++-----
>   1 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/utils/xml_parser.py b/utils/xml_parser.py
> index 04e7501..01b928f 100644
> --- a/utils/xml_parser.py
> +++ b/utils/xml_parser.py
> @@ -88,15 +88,21 @@ class xml_parser(object):
>                       if thenode.attributes != None:
>                           tmpattr = dict()
>                           if thenode.attributes.length > 0:
> -                            for key in thenode.attributes.keys():
> +                            for attrkey in thenode.attributes.keys():
>                                   tmpattr.update(
> -                                {key:thenode.attributes.get(key).nodeValue})
> +                                {attrkey:thenode.attributes.get(attrkey).nodeValue})
>                               attrdic = { "attr":tmpattr }
>                       if key in out:
>                           if out[key] == None:
> -                            out[key] = value
>                               if attrdic != None:
> -                                out[key].update(attrdic)
> +                                if value == None:
> +                                    out[key] = attrdic
> +                                else:
> +                                    valdic = { "value":value }
> +                                    valdic.update(attrdic)
> +                                    out[key] = valdic
> +                            else:
> +                                out[key] = value
>                           elif type(out[key]) == list:
>                               if attrdic != None:
>                                   newdict.update(attrdic)
> @@ -111,7 +117,13 @@ class xml_parser(object):
>                       else:
>                           out[key] = value
>                           if attrdic != None:
> -                            out[key].update(attrdic)
> +                            if value == None:
> +                                newdict[key] = attrdic
> +                            else:
> +                                valdic = { "value":value }
> +                                valdic.update(attrdic)
> +                                newdict = valdic
> +                            out[key] = newdict
>                   self.parseintodict(thenode, level+1, out, key)
>           return out
>   

     That's good, thanks
     ACK and pushed.




More information about the libvir-list mailing list