【问题标题】:Python : How to combine data from multiple XML filesPython:如何组合来自多个 XML 文件的数据
【发布时间】:2014-03-08 19:30:08
【问题描述】:

我正在使用元素树来解析 XML 文件。我有多个 XML 文件。 XML 文件的元素由唯一键 (SKU) 标识,但其他标记不同。我想将与另一个文件中的每个元素对应的标签组合起来。为此,我可以开始解析第一个 XML 的每个子元素并遍历其他文件的子元素以查找具有给定 sku 的元素:

tree = ET.parse(filename)
root = tree.getroot()
tree1 = ET.parse(filename1)
root1 = tree1.getroot()
...#more xmls
for child in root:
    sku = child.find('SKU').text
    for child1 in root1:
        sku1 = child1.find('SKU').text
        if sku == sku1:
            #do something

但我意识到这种方法效率不高。有更好的方法吗?

谢谢

编辑:例如。第一个 xml 具有以下形式的元素:

<product>
    <SKU>ABCD1234</SKU>
    <_Image>something</_Image>
    <_Image_Count>2</_Image_Count>
    <_Image2>something</_Image2>
    <_Image3>something</_Image3>
    <_Orignal_Image>something</_Orignal_Image>
</product>

第二个 XML 具有以下形式的元素:

<product>
    <Product_Code>ABCD1234</Product_Code>
    <Designer>xxx</Designer>
    <Taxon>yyy</Taxon>
    <Parent_Taxon>zzz</Parent_Taxon>
    <Taxonomy>aaa</Taxonomy>
    <Quantity>1</Quantity>
    <Cost>2</Cost>
    <MRP>3</MRP>
    <Price>4</Price>
</product>

我想结合这两个 XML 得到:

<product>
    <SKU>ABCD1234</SKU>
    <_Image>something</_Image>
    <_Image_Count>2</_Image_Count>
    <_Image2>something</_Image2>
    <_Image3>something</_Image3>
    <_Orignal_Image>something</_Orignal_Image>
    <Product_Code>ABCD1234</Product_Code>
    <Designer>xxx</Designer>
    <Taxon>yyy</Taxon>
    <Parent_Taxon>zzz</Parent_Taxon>
    <Taxonomy>aaa</Taxonomy>
    <Quantity>1</Quantity>
    <Cost>2</Cost>
    <MRP>3</MRP>
    <Price>4</Price>
</product>

【问题讨论】:

  • 不好意思说我没有关注 - 添加数据和输出的简短示例可能会有所帮助。
  • @PyNEwbie:添加了一个例子

标签: python xml elementtree


【解决方案1】:

编写一个类来管理每种类型的 xml 文件。它应该有一个方法,该方法接受一个 SKU 列表并返回一个包含您感兴趣的属性的事物集合。

另一个使用该集合,并使用它修改它拥有的 xml。

elementTree 对 xml 的支持有限,但查看您的示例文件,findall 方法将是获取“sku”节点集合的良好开端。

不要一口气做完,打开每个文件并使用嵌套循环绝对不是要走的路。

【讨论】:

    【解决方案2】:

    我建议查看BeautifulSoup 库。

    为创建组合 XML 编写了一个小示例 sn-p。

    from bs4 import BeautifulSoup
    
    first = BeautifulSoup(open("first.xml"), "lxml")
    
    first_as_dict = dict([(x.text, x.parent()) for x in first.find_all("sku")])
    
    second = BeautifulSoup(open("second.xml"), "lxml")
    # The actual tag name in your sample XML is "product_code",
    # its not "SKU" as in the first one, change this if that is not correct
    second_as_dict = dict([(x.text, x.parent()) for x in second.find_all("product_code")])
    
    combined = BeautifulSoup("", "lxml")
    
    for key, value in first_as_dict.iteritems():
        product_tag = combined.new_tag("product")
        items = value + second_as_dict[key]
        for item in items:
            product_tag.append(item)
        combined.append(product_tag)
    
    print(combined.prettify())
    

    【讨论】:

      【解决方案3】:

      我会以不同的方式做这件事。有几个方法可以将 Python 字典转换为 XML。

      1. 读入每个文件并将其转换为字典字典,其中外键是 SKU,内字典是所有其他元素。
      2. 创建一个主字典,将每个文件中的字典组合起来(参见combining dictionaries
      3. 使用结果创建一个 xml 文件

      如果您需要保持顺序,请使用有序字典。

      在我写这篇文章时,我认为从字典到 json 到 xml 可能更容易 -

      【讨论】:

        猜你喜欢
        • 2019-09-07
        • 2021-09-19
        • 2021-08-21
        • 1970-01-01
        • 2018-09-26
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多