我有两个XML文件要合并。我看了前面的其他问题,但我觉得我不能通过阅读这些问题来解决我的问题。我认为使我的情况独特的是,我必须通过属性值找到元素,然后合并到相反的文件中。在
我有两份文件。一个是英文翻译目录,另一个是日文翻译目录。请看下面。在
在下面的代码中,您将看到XML有三个元素,我将在其中合并子元素—MessageCatalogeEntry、MessageCatalogeFormEntry和MessageCatalogeFormEntry。我有数百个文件,每个文件有数千行。可能有比我刚才列出的三个元素更多的元素,但是我确信所有元素都有一个“key”属性。在
我的计划:
key_values = [321, 260, 320]
key=321
的元素。在key=321
元素的子元素。在key=321
的元素,并添加我先前从文件1抓取的子元素。在key_values
列表中循环相同的进程。在文件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')
任何帮助都将不胜感激。我已经在这工作了几天了,我还没有比刚开始的时候更接近完成任务了!在
实际上,您得到的是MessageCatalogEntry,问题出在print语句中。元素的作用类似于列表,因此
m[0]
是MessageCatalogEntry的第一个子元素。在将print更改为
print et.tostring(m, encoding='utf8')
,以查看正确的元素。在我个人更喜欢lxml而不是elementtree。假设您想通过'key'属性关联条目,那么可以使用xpath为其中一个文档编制索引,然后将它们拉到另一个文档中。在
^{pr2}$相关问题 更多 >
编程相关推荐