如何在条件(Python)下连接XML标记?
我有一个如下结构的XML文件:如何在条件(Python)下连接XML标记?,python,xml,tags,Python,Xml,Tags,我有一个如下结构的XML文件: <?xml version="1.0" encoding="utf-8" ?> <pages> <page id="1" bbox="0.000,0.000,462.047,680.315" rotate="0"> <textbox id="0" bbox="179.739,592.028,261.007,604.510"> <textline bbox="179.739,592
<?xml version="1.0" encoding="utf-8" ?>
<pages>
<page id="1" bbox="0.000,0.000,462.047,680.315" rotate="0">
<textbox id="0" bbox="179.739,592.028,261.007,604.510">
<textline bbox="179.739,592.028,261.007,604.510">
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">C</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">A</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">P</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">T</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">L</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text> </text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text>
</text>
</textline>
</textbox>
</page>
</pages>
import xml.etree.ElementTree as ET
MY_XML = ET.parse('fe.xml')
textlines = MY_XML.findall("./page/textbox/textline")
for textline in textlines:
fulltext = []
for text_elem in list(textline):
# Get the text of each 'text' element and then remove it
fulltext.append(text_elem.text)
textline.remove(text_elem)
# Create a new 'text' element and add the joined letters to it
new_text_elem = ET.Element("text", font="NUMPTY+ImprintMTnum", ncolour="0", size="12.482")
new_text_elem.text = "".join(fulltext).strip()
# Append the new 'text' element to its parent
textline.append(new_text_elem)
print(ET.tostring(MY_XML.getroot(), encoding="unicode"))
但它只对一个标签有效。我想我需要设置一个条件,以便for循环检查所有标记,但我还没有在web上找到关于如何执行该操作的信息。如何包含其他标签?非常感谢为什么
新文本元素
是具有固定属性的硬编码元素?您不知道要分配哪些属性
尝试以下方法。创建另一个将所有标记写入字典的内部for循环。您也可以迭代标记
对于下一个元素,请检查字典中是否有所有标记,以及它们是否相同。阅读有关字典比较的内容,或者只需迭代键并与=
进行比较
如果它们相同,则将该元素添加到迄今为止找到的相同元素列表中。然后检查下一个元素
如果它们不相同,则将列表中的所有元素添加为新元素,并合并文本。然后清除列表并重新开始
摘要:
- 您可以遍历
元素 - 在列表中存储所有具有相同标记的连续
元素 - 将它们一个接一个地存储在列表中可以保持顺序
- 遇到第一个不同的
元素后,首先编写存储的元素,使用它们存储的标记和值连接它们的文本 - 清除存储列表并重复
新文本元素
是具有固定属性的硬编码元素?您不知道要分配哪些属性
尝试以下方法。创建另一个将所有标记写入字典的内部for循环。您也可以迭代标记
对于下一个元素,请检查字典中是否有所有标记,以及它们是否相同。阅读有关字典比较的内容,或者只需迭代键并与=
进行比较
如果它们相同,则将该元素添加到迄今为止找到的相同元素列表中。然后检查下一个元素
如果它们不相同,则将列表中的所有元素添加为新元素,并合并文本。然后清除列表并重新开始
摘要:
- 您可以遍历
元素 - 在列表中存储所有具有相同标记的连续
元素 - 将它们一个接一个地存储在列表中可以保持顺序
- 遇到第一个不同的
元素后,首先编写存储的元素,使用它们存储的标记和值连接它们的文本 - 清除存储列表并重复
- 以下是您需要实现的核心逻辑
它不是一个端到端的解决方案,但它关注核心逻辑
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="utf-8" ?>
<pages>
<page id="1" bbox="0.000,0.000,462.047,680.315" rotate="0">
<textbox id="0" bbox="179.739,592.028,261.007,604.510">
<textline bbox="179.739,592.028,261.007,604.510">
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">C</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">A</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">P</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">T</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">L</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text> </text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text>
</text>
</textline>
</textbox>
</page>
</pages>'''
words = []
root = ET.fromstring(xml)
pages = root.findall('.//page')
for page in pages:
previous_key = None
current_key = None
texts = page.findall('.//text')
for txt in texts:
if previous_key:
current_key = (txt.attrib.get('font',previous_key[0]),txt.attrib.get('size',previous_key[1]))
else:
current_key = (txt.attrib.get('font','empty'),txt.attrib.get('size','empty'))
if current_key != previous_key:
words.append([])
words[-1].append(txt.text)
previous_key = current_key
for group in words:
if group:
print(''.join(group))
下面是您需要实现的核心逻辑 它不是一个端到端的解决方案,但它关注核心逻辑
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="utf-8" ?>
<pages>
<page id="1" bbox="0.000,0.000,462.047,680.315" rotate="0">
<textbox id="0" bbox="179.739,592.028,261.007,604.510">
<textline bbox="179.739,592.028,261.007,604.510">
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">C</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">A</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">P</text>
<text font="NUMPTY+ImprintMTnum-it" ncolour="0" size="12.333">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">T</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">L</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">O</text>
<text> </text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text font="NUMPTY+ImprintMTnum" ncolour="0" size="12.482">I</text>
<text>
</text>
</textline>
</textbox>
</page>
</pages>'''
words = []
root = ET.fromstring(xml)
pages = root.findall('.//page')
for page in pages:
previous_key = None
current_key = None
texts = page.findall('.//text')
for txt in texts:
if previous_key:
current_key = (txt.attrib.get('font',previous_key[0]),txt.attrib.get('size',previous_key[1]))
else:
current_key = (txt.attrib.get('font','empty'),txt.attrib.get('size','empty'))
if current_key != previous_key:
words.append([])
words[-1].append(txt.text)
previous_key = current_key
for group in words:
if group:
print(''.join(group))
谢谢你的回答,不过还不太清楚。。。“下一个元素”是什么意思?因为我希望文本的顺序与我找到的相同,所以我不明白如何保证这一点,因为我只是在比较标记(如果我理解得很好的话),我在答案的底部添加了一个列表。再次感谢你,但我不知道如何比较XML标记。。。我在网上查过,什么也没找到。你知道怎么读吗?它们在XML中称为属性。一旦你知道如何阅读它们,你就可以对它们进行比较,比如
is_same=“12.482”==some_attribute
查找child.attrib
谢谢你的回答,不过还不太清楚。。。“下一个元素”是什么意思?因为我希望文本的顺序与我找到的相同,所以我不明白如何保证这一点,因为我只是在比较标记(如果我理解得很好的话),我在答案的底部添加了一个列表。再次感谢你,但我不知道如何比较XML标记。。。我在网上查过,什么也没找到。你知道怎么读吗?它们在XML中称为属性。一旦你知道如何阅读它们,你就可以比较它们,比如is_same=“12.482”==一些属性
查找child.attrib
非常感谢!但是我的输出和你发布的不一样,我想知道为什么!但是它真的很有用。所以,它没有保留标签,这对我很重要,因为我需要知道文本的字体大小。我的答案只包括核心逻辑。我以为你能从这里拿走。非常感谢!但是我的输出和你发布的不一样,我想知道为什么!但是它真的很有用。所以,它没有保留标签,这对我很重要,因为我需要知道文本的字体大小。我的答案只包括核心逻辑。我以为你能从这里拿走它。
C
API
TOLO III