lxml namespace as an attribute

Skip Montanaro skip.montanaro at gmail.com
Wed Aug 15 17:25:44 EDT 2018


Much of XML makes no sense to me. Namespaces are one thing. If I'm
parsing a document where namespaces are defined at the top level, then
adding namespaces=root.nsmap works when calling the xpath method. I
more-or-less get that.

What I don't understand is how I'm supposed to search for a tag when
the namespace appears to be defined as an attribute of the tag itself.
I have some SOAP XML I'm trying to parse. It looks roughly like this:

<s: Envelope xmlns:a="..." xmlns:s="...">
  <s:Header>
     ...
  </s:Header>
  <s:Body>
    <Tag xmlns="http://some/new/path">
    ...
    </Tag>
  </s:Body>

If the document is "doc", I can find the body like so:

body = doc.xpath(".//Body" namespaces=doc.nsmap)

I don't understand how to find Tag, however. When I iterate over the
body's children, printing them out, I see that Tag's name is actually:

    {http://some/new/path}Tag

yet that namespace is unknown to me until I find Tag. It seems I'm
stuck in a chicken-and-egg situation. Without knowing that
http://some/new/path namespace, is there a way to cleanly find all
instances of Tag?

Thx,

Skip



More information about the Python-list mailing list