I have this XML

<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.16.1" type="navidrome" serverVersion="0.50.2 (823bef54)" openSubsonic="true"><searchResult3><song id="3b9d81b5def61a60705b9b89611a217f" parent="03693dd7b835740421cc1d6a4da201f3" isDir="false" title="Good Day featuring ScHoolboy Q" album="I Am &gt; I Was" artist="21 Savage" track="11" year="2018" genre="Rap" coverArt="mf-3b9d81b5def61a60705b9b89611a217f_5c1d3668" size="9716623" contentType="audio/mpeg" suffix="mp3" duration="242" bitRate="320" path="21 Savage/I Am &gt; I Was/11 - Good Day featuring ScHoolboy Q.mp3" created="2024-01-08T16:40:53.026754212Z" albumId="03693dd7b835740421cc1d6a4da201f3" artistId="1ae1d36568c651d53f78f427f05e9766" type="music" isVideo="false" bpm="0" comment=""><genres name="Rap"></genres></song></searchResult3></subsonic-response>

Which I got from an API call

I would like to be able to interact with it so I can check the artist and then pull the id

I thought this would be as simple as calling a key on an array (wrong terminology I know. Dict?), how wrong was I?

Having done some searching, I’m in the process of figuring out how xml.etree.ElementTree works. But it feels so overly complicated for what I’m trying to do? Am I going down the wrong path?

  • @[email protected]
    link
    fedilink
    English
    10
    edit-2
    6 months ago

    Nah, I’d say ElementTree is the way to go.

    JSON is so nice and easy to work with, it’s spoiled us. XML came before JSON. XML is really a terrible, overengineered, lovecraftian pit of madness on which JSON is a massive improvement for many applications. (YAML’s also pretty yucky, though still an improvement on XML for other applications than JSON is appropriate for. Not terribly difficult to parse. More just littered with gotchas.)

    But, if you want to parse XML in Python, ElementTree is the best way to do it.

    • @[email protected]OP
      link
      fedilink
      English
      26 months ago

      I think I can get a JSON response, would I then be able to do json[element] or would I still need to parse left, right and centre through complication valley?

      • @[email protected]
        link
        fedilink
        English
        66 months ago

        JSON would be a lot easier. Once you’ve parsed it, you’ve got a little structure of dicts, lists, and primitives. So you’d be able to directly index things like you’re hoping.

        Just to give an example:

        >>> import json
        >>> parsed = json.loads('{"foo":"a", "bar":"b", " baz":"c"}')
        >>> parsed["foo"]
        'a'
        

        So, in short, yes, JSON would do what you’re hoping.