Reputation: 12401
I want to create the following XML with lxml
package:
<configuration xmlns:cond="http://www.aaa.com/orc/condition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/variation-config.xsd">
<strategy id="XXX">
<conditions>
<cond:scenario>A</cond:scenario>
</conditions>
</strategy>
</configuration>
So far, I have the following code, which is not satisfactory at all:
XHTML_NAMESPACE = "http://www.aaa.com/orc/condition"
XHTML = "{%s}" % XHTML_NAMESPACE
NSMAP = {
'cond' : XHTML_NAMESPACE,
'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
}
root = etree.Element(
"configuration",
nsmap=NSMAP,
)
strategy = etree.SubElement(root, "strategy", id="XXX")
conditions = etree.SubElement(strategy, "conditions")
cond1 = etree.SubElement(conditions, XHTML + "scenario", nsmap=NSMAP)
cond1.text = "A"
It gives me that:
<configuration xmlns:cond="http://www.aaa.com/orc/condition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<strategy id="XXX">
<conditions>
<cond:scenario>A</cond:scenario>
</conditions>
</strategy>
</configuration>
Question:
I just miss the xsi:noNamespaceSchemaLocation="../schema/variation-config.xsd"
. Do you know how I could add that to the XML?
Upvotes: 1
Views: 106
Reputation: 22617
After you updated your question with a better solution, I think you are missing a way to set an attribute for an existing element. Use the set
method:
root.set(XSI + "noNamespaceSchemaLocation", "../schema/variation-config.xsd")
Also, when you add a subelement to an element that already knows namespaces defined in nsmap
, there is no need to include nsmap
again. In other words, instead of
cond1 = etree.SubElement(conditions, XHTML + "scenario", nsmap=NSMAP)
you can write
cond1 = etree.SubElement(conditions, XHTML + "scenario")
Finally, XHTML
is an unfortunate variable name, since XHTML is a standard namespace.
Solution that produces the correct result
from lxml import etree
COND_NAMESPACE = "http://www.aaa.com/orc/condition"
XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"
COND = "{%s}" % COND_NAMESPACE
XSI = "{%s}" % XSI_NAMESPACE
nsmap = {"cond": "http://www.aaa.com/orc/condition", "xsi": "http://www.w3.org/2001/XMLSchema-instance"}
root = etree.Element("configuration", nsmap=nsmap)
root.set(XSI + "noNamespaceSchemaLocation", "../schema/variation-config.xsd")
strategy = etree.SubElement(root, "strategy", id="XXX")
conditions = etree.SubElement(strategy, "conditions")
scenario = etree.SubElement(conditions, COND + "scenario")
scenario.text = "A"
print(etree.tostring(root, pretty_print=True))
Output
<configuration xmlns:cond="http://www.aaa.com/orc/condition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/variation-config.xsd">
<strategy id="XXX">
<conditions>
<cond:scenario>A</cond:scenario>
</conditions>
</strategy>
</configuration>
Upvotes: 2