取 2 XML 个元素并合并成 1 个新元素 - Python
Take 2 XML elements and merge into 1 new element - Python
我目前正在使用 OpenStreetMap XML 文档开展一个项目。该项目的一部分是验证一些数据及其一致性。我对 Python 和使用 XML 文件相当陌生,所以我真的不知道从哪里开始。
这是我的 XML 文档的片段:
<way id="11005330" version="2" timestamp="2013-02-05T20:56:45Z" changeset="14926577" uid="451693" user="bot-mode">
<nd ref="98006629"/>
<nd ref="98006630"/>
<nd ref="98006631"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Kiwi Court"/>
<tag k="tiger:cfcc" v="A41"/>
<tag k="tiger:county" v="Lake, FL"/>
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
<tag k="tiger:reviewed" v="no"/>
<tag k="tiger:zip_left" v="34714"/>
<tag k="tiger:zip_right" v="34714"/>
我现在要做的是:
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
并将它们组合成一个新标签:
<tag k="addr:street" v="Kiwi Ct"/>
另一件事是,并非所有这些都具有 name_base 和 name_type。所以对于那些我只想创建 addr:street 标签。
这是一个非常大的文件,因此它必须逐一查看并创建它。创建新标签后,我需要继续删除元素。
我正在使用:import xml.etree.cElementTree as ET
编辑
我能够解决部分问题
root = tree.getroot()
for way in root.findall(".//way"):
kbool = False
tbool = False
for key in way.iterfind(".//tag"):
if key.attrib['k'] == "tiger:name_base":
kbool = True
# print(key.attrib['v'])
base = key.attrib['v']
if key.attrib['k'] == "tiger:name_type":
tbool = True
ttype = key.attrib['v']
if kbool == True and tbool == True:
ET.SubElement(way, 'tag k="addr:street" v="{} {}"'.format(base, ttype))
elif kbool == True and tbool == False:
ET.SubElement(way, 'tag k="addr:street" v="{}"'.format(base))
tree.write('maps')
我现在遇到的问题是,即使没有 tiger:name_base 键,它也会写入地址属性。
使用 ElementTree
.
XML = """<root>
<way id="11005330" version="2" timestamp="2013-02-05T20:56:45Z" changeset="14926577" uid="451693" user="bot-mode">
<nd ref="98006629"/>
<nd ref="98006630"/>
<nd ref="98006631"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Kiwi Court"/>
<tag k="tiger:cfcc" v="A41"/>
<tag k="tiger:county" v="Lake, FL"/>
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
<tag k="tiger:reviewed" v="no"/>
<tag k="tiger:zip_left" v="34714"/>
<tag k="tiger:zip_right" v="34714"/>
</way>
</root>"""
演示:
import xml.etree.ElementTree as ET
tree = ET.parse(filename)
doc = tree.getroot()
for way in doc.findall(".//way"): #Find all way tags
name_base = way.find('.//tag[@k="tiger:name_base"]').get("v") #Get tiger:name_base attr
way.remove(way.find('.//tag[@k="tiger:name_base"]')) #Remove Tag
name_type = way.find('.//tag[@k="tiger:name_type"]').get("v") #Get tiger:name_type attr
way.remove(way.find('.//tag[@k="tiger:name_type"]')) #Remove Tag
newNode = ET.SubElement(way, '''tag k="addr:street" v="{} {}"'''.format(name_base, name_type)) #Add New Tag
tree.write(r"C:\Users\Rakesh\Desktop\testFiles\A2.xml") #Write to file
输出:
<root>
<way changeset="14926577" id="11005330" timestamp="2013-02-05T20:56:45Z" uid="451693" user="bot-mode" version="2">
<nd ref="98006629" />
<nd ref="98006630" />
<nd ref="98006631" />
<tag k="highway" v="residential" />
<tag k="name" v="Kiwi Court" />
<tag k="tiger:cfcc" v="A41" />
<tag k="tiger:county" v="Lake, FL" />
<tag k="tiger:reviewed" v="no" />
<tag k="tiger:zip_left" v="34714" />
<tag k="tiger:zip_right" v="34714" />
<tag k="addr:street" v="Kiwi Ct" /></way>
</root>
我目前正在使用 OpenStreetMap XML 文档开展一个项目。该项目的一部分是验证一些数据及其一致性。我对 Python 和使用 XML 文件相当陌生,所以我真的不知道从哪里开始。
这是我的 XML 文档的片段:
<way id="11005330" version="2" timestamp="2013-02-05T20:56:45Z" changeset="14926577" uid="451693" user="bot-mode">
<nd ref="98006629"/>
<nd ref="98006630"/>
<nd ref="98006631"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Kiwi Court"/>
<tag k="tiger:cfcc" v="A41"/>
<tag k="tiger:county" v="Lake, FL"/>
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
<tag k="tiger:reviewed" v="no"/>
<tag k="tiger:zip_left" v="34714"/>
<tag k="tiger:zip_right" v="34714"/>
我现在要做的是:
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
并将它们组合成一个新标签:
<tag k="addr:street" v="Kiwi Ct"/>
另一件事是,并非所有这些都具有 name_base 和 name_type。所以对于那些我只想创建 addr:street 标签。
这是一个非常大的文件,因此它必须逐一查看并创建它。创建新标签后,我需要继续删除元素。
我正在使用:import xml.etree.cElementTree as ET
编辑
我能够解决部分问题
root = tree.getroot()
for way in root.findall(".//way"):
kbool = False
tbool = False
for key in way.iterfind(".//tag"):
if key.attrib['k'] == "tiger:name_base":
kbool = True
# print(key.attrib['v'])
base = key.attrib['v']
if key.attrib['k'] == "tiger:name_type":
tbool = True
ttype = key.attrib['v']
if kbool == True and tbool == True:
ET.SubElement(way, 'tag k="addr:street" v="{} {}"'.format(base, ttype))
elif kbool == True and tbool == False:
ET.SubElement(way, 'tag k="addr:street" v="{}"'.format(base))
tree.write('maps')
我现在遇到的问题是,即使没有 tiger:name_base 键,它也会写入地址属性。
使用 ElementTree
.
XML = """<root>
<way id="11005330" version="2" timestamp="2013-02-05T20:56:45Z" changeset="14926577" uid="451693" user="bot-mode">
<nd ref="98006629"/>
<nd ref="98006630"/>
<nd ref="98006631"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Kiwi Court"/>
<tag k="tiger:cfcc" v="A41"/>
<tag k="tiger:county" v="Lake, FL"/>
<tag k="tiger:name_base" v="Kiwi"/>
<tag k="tiger:name_type" v="Ct"/>
<tag k="tiger:reviewed" v="no"/>
<tag k="tiger:zip_left" v="34714"/>
<tag k="tiger:zip_right" v="34714"/>
</way>
</root>"""
演示:
import xml.etree.ElementTree as ET
tree = ET.parse(filename)
doc = tree.getroot()
for way in doc.findall(".//way"): #Find all way tags
name_base = way.find('.//tag[@k="tiger:name_base"]').get("v") #Get tiger:name_base attr
way.remove(way.find('.//tag[@k="tiger:name_base"]')) #Remove Tag
name_type = way.find('.//tag[@k="tiger:name_type"]').get("v") #Get tiger:name_type attr
way.remove(way.find('.//tag[@k="tiger:name_type"]')) #Remove Tag
newNode = ET.SubElement(way, '''tag k="addr:street" v="{} {}"'''.format(name_base, name_type)) #Add New Tag
tree.write(r"C:\Users\Rakesh\Desktop\testFiles\A2.xml") #Write to file
输出:
<root>
<way changeset="14926577" id="11005330" timestamp="2013-02-05T20:56:45Z" uid="451693" user="bot-mode" version="2">
<nd ref="98006629" />
<nd ref="98006630" />
<nd ref="98006631" />
<tag k="highway" v="residential" />
<tag k="name" v="Kiwi Court" />
<tag k="tiger:cfcc" v="A41" />
<tag k="tiger:county" v="Lake, FL" />
<tag k="tiger:reviewed" v="no" />
<tag k="tiger:zip_left" v="34714" />
<tag k="tiger:zip_right" v="34714" />
<tag k="addr:street" v="Kiwi Ct" /></way>
</root>