从一个文件解析特定的XML属性并将其附加到另一个fi中,如果第二个fi中存在另一个属性

2024-09-26 17:46:01 发布

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

我有三个XML文件(示例如下)。我已经用它们各自的audioId属性值命名了这些文件。因此,有问题的文件将被称为93.xml2137.xml

93.xml文件:

<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="93" />

2173.xml文件:

^{pr2}$

在主数据集.xml公司名称:

<word id="2137" title="over" level="1" grouping="Sight Words" YRule="0" MagicE="0" SoftC="0" doublevowel="0" longvowel="0" displayorder="101" silentletters="0"/>

文件mainDataSet.xml包含~3000个条目。为了回答这个问题,我只提供了一个条目。在

我的问题是,如果mainDataSet.xml中的title属性与mainDataSet.xml中的mainDataSet.xml中的title属性追加到2173.xml中的word标记,如果mainDataSet.xml中的id与文件名匹配(或者即使mainDataSet.xml中的id与文件名匹配)。例如,在我提供的示例中,输出应该是:

<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="2137" title="over" />

要从mainDataSet.xml解析XML,我当前正在执行以下操作:

e = xml.etree.ElementTree.parse('mainDataSet.xml').getroot()
for atype in e.findall('word'):
    print(atype.get('title'))

Tags: 文件id示例属性titlexmlstagelist
2条回答

要添加属性,请使用^{}字典。下面是一个示例代码,它循环遍历mainDataSet.xml内的word元素,检索id属性值,解析适当的XML文件(93.xml和{}),更新word元素并将树转储回文件:

import xml.etree.ElementTree as ET


e = ET.parse('mainDataSet.xml').getroot()
for word in e.findall('word'):
    word_id = word.attrib.get("id")
    if word_id:
        filename = "%s.xml" % word_id
        e_word = ET.parse(filename)
        e_word.getroot().attrib['title'] = word.attrib.get('title')
        e_word.write(filename)

我使用的示例mainDataSet.xml

^{pr2}$

以下是我运行脚本后得到的结果:

  • 93.xml

    <word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="93" title="something else" />
    
  • 2173.xml

    <word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="2137" title="over" />
    

对于OP或将来的读者,请考虑一个xslt1.0解决方案,Python可以使用lxml模块运行该解决方案。作为信息,XSLT是一种特殊用途的语言(其脚本是格式良好的xml文件),旨在操作xml文件。该脚本可移植到其他通用语言(Java、PHP、C)、XSLT处理器(Saxon、Xalan),甚至命令行解释器(Bash、PowerShell)。具体来说,对于这个问题,XSLT维护了^{}函数,该函数可以访问外部xml文件中的节点,以满足ids之类的比较需求。在

输入(添加根标记)

在主数据集.xml在

<root>
   <word id="2137" title="over" level="1" grouping="Sight Words" YRule="0" 
         MagicE="0" SoftC="0" doublevowel="0" longvowel="0" 
         displayorder="101" silentletters="0"/>
</root>

2137.xml文件

^{pr2}$

93.xml文件

<root>
   <word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7"
         Stage="0" Use="P,L" audioId="93" />
</root>

XSLTScript(外部另存为.xsl;read-in.py;假设所有XML文件都在同一目录中)

^{4}$

Python脚本

import lxml.etree as ET

# LOAD XML AND XSL
xslt = ET.parse('XSLTScript.xsl')
for i in ['2137', '93']:
    dom = ET.parse('{}.xml'.format(i))

    # TRANSFORM XML
    transform = ET.XSLT(xslt)
    newdom = transform(dom)

    # PRETTY PRINT OUTPUT
    tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True)
    print(tree_out.decode("utf-8"))

    # SAVE TO FILE
    xmlfile = open('{}.xml'.format(i),'wb')
    xmlfile.write(tree_out)
    xmlfile.close()

输出(使用发布的数据)

2173.xml文件

<root>
  <word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" 
        Use="P,L" audioId="2137" title="over"/>
</root>

93.xml文件

<root>
  <word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" 
        Use="P,L" audioId="93"/>
</root>

相关问题 更多 >

    热门问题