def _XmlBuild(ElementType, ElementData, WithHeaders=True, data=None): # noqa
xml = ""
if WithHeaders:
xml += '<?xml version="1.0" encoding="UTF-8"?>\n'
xml += '<osm version="0.6" generator="'
xml += data._created_by + '">\n'
# <element attr="val">
xml += " <" + ElementType
if "id" in ElementData:
xml += ' id="' + str(ElementData["id"]) + '"'
if "lat" in ElementData:
xml += ' lat="' + str(ElementData["lat"]) + '"'
if "lon" in ElementData:
xml += ' lon="' + str(ElementData["lon"]) + '"'
if "version" in ElementData:
xml += ' version="' + str(ElementData["version"]) + '"'
visible_str = str(ElementData.get("visible", True)).lower()
xml += ' visible="' + visible_str + '"'
if ElementType in ["node", "way", "relation"]:
xml += ' changeset="' + str(data._CurrentChangesetId) + '"'
xml += ">\n"
# <tag... />
for k, v in ElementData.get("tag", {}).items():
xml += ' <tag k="' + _XmlEncode(k)
xml += '" v="' + _XmlEncode(v) + '"/>\n'
# <member... />
for member in ElementData.get("member", []):
xml += ' <member type="' + member["type"]
xml += '" ref="' + str(member["ref"])
xml += '" role="' + _XmlEncode(member["role"])
xml += '"/>\n'
# <nd... />
for ref in ElementData.get("nd", []):
xml += ' <nd ref="' + str(ref) + '"/>\n'
# </element>
xml += " </" + ElementType + ">\n"
if WithHeaders:
xml += "</osm>\n"
return xml.encode("utf8")
def _XmlEncode(text):
return (
text.replace("&", "&")
.replace('"', """)
.replace("<", "<")
.replace(">", ">")
)
def _GetXmlValue(DomElement, tag):
try:
elem = DomElement.getElementsByTagName(tag)[0]
return elem.firstChild.nodeValue
except Exception:
return None