通过按属性值匹配元素来合并两个XML文件

2024-09-28 22:31:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个XML文件要合并。我看了前面的其他问题,但我觉得我不能通过阅读这些问题来解决我的问题。我认为使我的情况独特的是,我必须通过属性值找到元素,然后合并到相反的文件中。在

我有两份文件。一个是英文翻译目录,另一个是日文翻译目录。请看下面。在

在下面的代码中,您将看到XML有三个元素,我将在其中合并子元素—MessageCatalogeEntry、MessageCatalogeFormEntry和MessageCatalogeFormEntry。我有数百个文件,每个文件有数千行。可能有比我刚才列出的三个元素更多的元素,但是我确信所有元素都有一个“key”属性。在

我的计划:

  • 迭代文件1并创建“key”属性的所有值的列表。
    • 在本例中,列表将是key_values = [321, 260, 320]
  • 接下来,我将逐一查看key\u值列表。在
  • 我将在文件1中搜索属性为key=321的元素。在
  • 接下来,从文件1获取带有key=321元素的子元素。在
  • 接下来,在文件2中,找到带有key=321的元素,并添加我先前从文件1抓取的子元素。在
  • 接下来,我将继续在key_values列表中循环相同的进程。在
  • 接下来,我将把新的xml根目录写到一个文件中,注意保持utf8编码。在

文件1:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE MessageCatalogue []>
<PackageEntry>
    <MessageCatalogue designNotes="Undefined" isPrivate="false" lastKey="362" name="AddKMRichSearchEngineAdmin_AutoTranslationCatalogue" nested="false" version="3.12.0">
      <MessageCatalogueEntry key="321">
        <MessageCatalogueEntry_loc locale="" message="active"/>
      </MessageCatalogueEntry>
      <MessageCatalogueFormEntry key="260">
        <MessageCatalogueFormEntry_loc locale="" shortTitle="Configuration" title="Spider Configuration"/>
      </MessageCatalogueFormEntry>
      <MessageCatalogueFormItemEntry key="320">
        <MessageCatalogueFormItemEntry_loc hintText="" label="Manage Recognised Phrases" locale="" mnemonic="" scriptText=""/>
      </MessageCatalogueFormItemEntry>
    </MessageCatalogue>
  </PackageEntry>

文件2:

^{pr2}$

输出:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE MessageCatalogue []>
<PackageEntry>
    <MessageCatalogue designNotes="Undefined" isPrivate="false" lastKey="362" name="AddKMRichSearchEngineAdmin_AutoTranslationCatalogue" nested="false" version="3.12.0">
      <MessageCatalogueEntry key="321">
        <MessageCatalogueEntry_loc locale="" message="active"/>
        <MessageCatalogueEntry_loc locale="ja" message="アクティブ" />
      </MessageCatalogueEntry>
      <MessageCatalogueFormEntry key="260">
        <MessageCatalogueFormEntry_loc locale="" shortTitle="Configuration" title="Spider Configuration"/>
        <MessageCatalogueFormEntry_loc locale="ja" shortTitle="設定" title="Spider Configuration/スパイダー設定" />
      </MessageCatalogueFormEntry>
      <MessageCatalogueFormItemEntry key="320">
        <MessageCatalogueFormItemEntry_loc hintText="" label="Manage Recognised Phrases" locale="" mnemonic="" scriptText=""/>
        <MessageCatalogueFormItemEntry_loc hintText="" label="認識されたフレーズを管理" locale="ja" mnemonic="" scriptText="" />
      </MessageCatalogueFormItemEntry>
    </MessageCatalogue>
  </PackageEntry>

我甚至在抓取元素时都有困难,永远不要按键值抓取它们。例如,我一直在玩elementtree库,我写了这段代码,希望只得到messagecatalogeentry,但我只得到了它们的孩子:

from xml.etree import ElementTree as et

tree_japanese = et.parse('C:\\blah\\blah\\blah\\AddKMRichSearchEngineAdmin_AutoTranslationCatalogue_JA.xml')
root_japanese = tree_japanese.getroot()
MC_japanese =  root_japanese.findall("MessageCatalogue")

for x in MC_japanese:
    messageCatalogueEntry = x.findall("MessageCatalogueEntry")
    for m in messageCatalogueEntry:
        print et.tostring(m[0], encoding='utf8')

tree_english = et.parse('C:\\blah\\blah\\blah\\AddKMRichSearchEngineAdmin\\AddKMRichSearchEngineAdmin_AutoTranslationCatalogue.xml')
root_english = tree_english.getroot()
MC_english =  root_english.findall("MessageCatalogue")

for x in MC_english:
    messageCatalogueEntry = x.findall("MessageCatalogueEntry")
    for m in messageCatalogueEntry:
        print et.tostring(m[0], encoding='utf8')

任何帮助都将不胜感激。我已经在这工作了几天了,我还没有比刚开始的时候更接近完成任务了!在


Tags: 文件key元素englishxmlconfigurationlocaleloc
1条回答
网友
1楼 · 发布于 2024-09-28 22:31:22

实际上,您得到的是MessageCatalogEntry,问题出在print语句中。元素的作用类似于列表,因此m[0]是MessageCatalogEntry的第一个子元素。在

messageCatalogueEntry = x.findall("MessageCatalogueEntry")
for m in messageCatalogueEntry:
    print et.tostring(m[0], encoding='utf8')

将print更改为print et.tostring(m, encoding='utf8'),以查看正确的元素。在

我个人更喜欢lxml而不是elementtree。假设您想通过'key'属性关联条目,那么可以使用xpath为其中一个文档编制索引,然后将它们拉到另一个文档中。在

^{pr2}$

相关问题 更多 >