当前位置: 首页 > 面试题库 >

合并带有嵌套元素的xml文件,而无需外部库

孟智志
2023-03-14
问题内容

我正在尝试使用Python将多个XML文件合并在一起,并且没有外部库。XML文件具有嵌套元素。

样本文件1:

<root>
  <element1>textA</element1>
  <elements>
    <nested1>text now</nested1>
  </elements>
</root>

样本文件2:

<root>
  <element2>textB</element2>
  <elements>
    <nested1>text after</nested1>
    <nested2>new text</nested2>
  </elements>
</root>

我想要的是:

<root>
  <element1>textA</element1>    
  <element2>textB</element2>  
  <elements>
    <nested1>text after</nested1>
    <nested2>new text</nested2>
  </elements>  
</root>

我试过的

从这个答案。

from xml.etree import ElementTree as et
def combine_xml(files):
    first = None
    for filename in files:
        data = et.parse(filename).getroot()
        if first is None:
            first = data
        else:
            first.extend(data)
    if first is not None:
        return et.tostring(first)

我得到什么:

<root>
  <element1>textA</element1>
  <elements>
    <nested1>text now</nested1>
  </elements>
  <element2>textB</element2>
  <elements>
    <nested1>text after</nested1>
    <nested2>new text</nested2>
  </elements>
</root>

希望您能看到并理解我的问题。我正在寻找适当的解决方案,任何指导都将是美好的。

为了解决这个问题,使用当前的解决方案,不会合并嵌套元素。


问题答案:

您发布的代码正在执行的操作是组合所有元素,而不管是否存在具有相同标签的元素。因此,您需要遍历元素并按照您认为合适的方式手动检查和组合它们,因为这不是处理XML文件的标准方法。我无法比代码更好地解释它,所以在这里或多或少地注释了一下:

from xml.etree import ElementTree as et

class XMLCombiner(object):
    def __init__(self, filenames):
        assert len(filenames) > 0, 'No filenames!'
        # save all the roots, in order, to be processed later
        self.roots = [et.parse(f).getroot() for f in filenames]

    def combine(self):
        for r in self.roots[1:]:
            # combine each element with the first one, and update that
            self.combine_element(self.roots[0], r)
        # return the string representation
        return et.tostring(self.roots[0])

    def combine_element(self, one, other):
        """
        This function recursively updates either the text or the children
        of an element if another element is found in `one`, or adds it
        from `other` if not found.
        """
        # Create a mapping from tag name to element, as that's what we are fltering with
        mapping = {el.tag: el for el in one}
        for el in other:
            if len(el) == 0:
                # Not nested
                try:
                    # Update the text
                    mapping[el.tag].text = el.text
                except KeyError:
                    # An element with this name is not in the mapping
                    mapping[el.tag] = el
                    # Add it
                    one.append(el)
            else:
                try:
                    # Recursively process the element, and update it in the same way
                    self.combine_element(mapping[el.tag], el)
                except KeyError:
                    # Not in the mapping
                    mapping[el.tag] = el
                    # Just add it
                    one.append(el)

if __name__ == '__main__':
    r = XMLCombiner(('sample1.xml', 'sample2.xml')).combine()
    print '-'*20
    print r


 类似资料:
  • 在我使用Jsoup连接到Instagram页面后,我想从一个标记中提取整个外部html。不知怎的,当我检查页面并从标记中复制外部html时,我得到了大量的行,而我使用Jsoup只得到了很少的行(不知怎的,嵌套标记的html被忽略了)任何帮助都将感谢如何获得整个html! 代码: 输出: 编辑:我希望保存span标记的整个HTML(我希望HTMLUnit/JSOUP的结果与我右键单击标记时的结果相同

  • 我在解组字符串时遇到了这个错误。我已经使用JAXB创建了Java文件。 输入字符串:

  • 我目前正在学习如何在android中使用Jaxb解析xml文件。但是我不知道代码中有什么错误,以及在哪里和如何纠正它。我无法解析xml并获得食品列表。如果我删除List并简单地把它写成Food,那么只有xml中的最后一个元素被解析,其余的似乎都被覆盖了。请帮助我。 我试图解析http://www.w3schools.com/xml/simple.xml,,目前我有这样的代码: ---- 用于取消

  • 我想选择一个特定的元素: 我得到了这个错误: 线程“main”组织中出现异常。阿帕奇。火花sql。AnalysisException:无法解析文件。柱。列[_name]'由于数据类型不匹配:参数2需要整数类型,但“_name”是字符串类型。;在org。阿帕奇。火花sql。催化剂分析套餐$AnalysisErrorAt。组织的故障分析(scala包:42)。阿帕奇。火花sql。催化剂分析检查分析$$

  • 我需要从这个JSON中获取所有值作为数组,并放心 这是示例JSON 使用jsonpath提取器,它是 但我需要放心地提取路径 但是它不起作用,我怎么写JSON路径来得到需要的数组呢?

  • 问题内容: 我想嵌套每个XML元素。 请看以下示例: 它将返回以下XML: 这不是我想要XML格式化的方式。而是我希望每个元素都被如下所示的元素包裹: 这家伙有帮助吗? 问题答案: 好的,这是代码。 这是输出。 祝你好运…