Reputation: 919
In the documentation I'm looking at for a file upload, it needs this specific tag at the beginning of the xml file:
<oclcPersonas xmlns="http://worldcat.org/xmlschemas/IDMPersonas-2.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://worldcat.org/xmlschemas/IDMPersonas-2.2 IDMPersonas-2.2.xsd">
I'm trying to use the lxml.etree library to figure this out.
Many of the examples I've seen have a initial level of namespace for attributes that would cover the xmlns:xsi
portion using this:
namespace_map = {
None: persona_namespace,
'xsi': "http://www.w3.org/2001/XMLSchema-instance"}
but 2 questions arise from the second portion xsi:schemaLocation
1) How would I accomplish a secondary level of namespace using lxml?
2) How do I allow the namespaces to contain a space without receiving an error (http://worldcat.org/xmlschemas/IDMPersonas-2.2 IDMPersonas-2.2.xsd
)
Upvotes: 0
Views: 157
Reputation: 22942
In your sample XML, you have :
oclcPersonas
in the default namespace,To build this element with lxml, you need to use the fully-qualified name using curly braces (James Clark notation).
First define a dictionary which store your namespace mapping:
# your namespaces
p_url = "http://worldcat.org/xmlschemas/IDMPersonas-2.2"
xsi_url = "http://www.w3.org/2001/XMLSchema-instance"
NS = {None: p_url, 'xsi': xsi_url}
In order to build fully-qualified namespace, you can define prefixes:
# tag prefixes
P = '{' + p_url + '}'
XSI = '{' + xsi_url + '}'
Then you can define the tag names and attributes:
# tag names and attributes
root_tag = P + 'oclcPersonas'
attrs = {
XSI + 'schemaLocation':
"http://worldcat.org/xmlschemas/IDMPersonas-2.2 IDMPersonas-2.2.xsd"
}
The root element can be created like below:
# element
root = etree.Element(root_tag, attrib=attrs, nsmap=NS)
You should have your element:
print(etree.tounicode(root))
To answer your question:
2) How do I allow the namespaces to contain a space without receiving an error (
http://worldcat.org/xmlschemas/IDMPersonas-2.2 IDMPersonas-2.2.xsd
)
This is not a namespace, this is the value of the schemaLocation
attribute. A simple string.
Upvotes: 1