Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在条件(Python)下连接XML标记?_Python_Xml_Tags - Fatal编程技术网

如何在条件(Python)下连接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文件:

<?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