使用 Python 解析 XML 并保存为 txt

您有一个包含如下 xml 文件的文件夹:

<PubmedArticleSet>
  <PubmedArticle>
    <MedlineCitation Owner="NLM" Status="MEDLINE">
      <PMID Version="1">23458631</PMID>
      <DateCreated>
        <Year>2013</Year>
        <Month>04</Month>
        <Day>08</Day>
      </DateCreated>
      <MeshHeadingList>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Animals</DescriptorName>
        </MeshHeading>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Calcium</DescriptorName>
          <QualifierName MajorTopicYN="Y">metabolism</QualifierName>
        </MeshHeading>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Calcium Chloride</DescriptorName>
          <QualifierName MajorTopicYN="N">administration &amp; dosage</QualifierName>
        </MeshHeading>
      </MeshHeadingList>
    </MedlineCitation>
  </PubmedArticle>
  <PubmedArticle>
    <MedlineCitation Status="Publisher" Owner="NLM">
      <PMID Version="1">23458629</PMID>
      <DateCreated>
        <Year>2013</Year>
        <Month>3</Month>
        <Day>20</Day>
      </DateCreated>
      <MeshHeadingList>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Adolescent</DescriptorName>
        </MeshHeading>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Adult</DescriptorName>
        </MeshHeading>
        <MeshHeading>
          <DescriptorName MajorTopicYN="N">Anthropometry</DescriptorName>
        </MeshHeading>
      </MeshHeadingList>
    </MedlineCitation>
  </PubmedArticle>
</PubmedArticleSet>

您希望使用 Python 来解析这些 XML 文件,并提取出每篇文章的 PMID、日期、所有的 DescriptorName 和 MajorTopicYN。然后,将结果保存为类似下面的 txt 文件:

ArticleID|CreatedDate|MeSH|IsMajor
23458631|20130408|Animals|N
23458631|20130408|Calcium|N
23458631|20130408|Calcium Chloride|N
23458629|20130320|Adolescent|N
23458629|20130320|Adult|N
23458629|20130320|Anthropometry|N

2 解决方案

2.1 解析 XML 文件

首先,您需要使用 ElementTree 库来解析 XML 文件。ElementTree 是 Python 标准库的一部分,因此您无需安装其他库。

import xml.etree.ElementTree as ET

tree = ET.parse('data.xml')
root = tree.getroot()

这将加载 XML 文件并创建一个 ElementTree 对象。ElementTree 对象包含了整个 XML 文档的结构。

2.2 提取数据

接下来,您需要从 ElementTree 对象中提取出您想要的数据。您可以使用 XPath 表达式来查找 XML 文档中的特定元素。

for pubmed_article in root.findall('PubmedArticle'):
    ArticleID = pubmed_article.find('MedlineCitation').find('PMID').text
    year = pubmed_article.find('MedlineCitation').find('DateCreated').find('Year').text
    month = pubmed_article.find('MedlineCitation').find('DateCreated').find('Month').text
    day = pubmed_article.find('MedlineCitation').find('DateCreated').find('Day').text
    CreatedDate = year + month + day
    for mesh_heading in pubmed_article.find('MedlineCitation').find('MeshHeadingList').findall('MeshHeading'):
        MeSH = mesh_heading.find('DescriptorName').text
        IsMajor = mesh_heading.find('DescriptorName').get('MajorTopicYN')
        line_to_write = ArticleID + '|' + CreatedDate + '|' + MeSH + '|' + IsMajor + '\n'

        with open('my_text_file.txt', 'a') as f:
            f.write(line_to_write)

这段代码将遍历所有的 PubmedArticle 元素,并为每个元素提取出 PMID、日期、所有的 DescriptorName 和 MajorTopicYN。然后,将这些数据保存到一个名为 my_text_file.txt 的文件中。

2.3 代码示例

下面的完整代码示例演示了如何使用 ElementTree 库来解析 XML 文件并保存为 txt 文件:

import xml.etree.ElementTree as ET

tree = ET.parse('data.xml')
root = tree.getroot()

with open('my_text_file.txt', 'w') as f:
    f.write('ArticleID|CreatedDate|MeSH|IsMajor\n')
    for pubmed_article in root.findall('PubmedArticle'):
        ArticleID = pubmed_article.find('MedlineCitation').find('PMID').text
        year = pubmed_article.find('MedlineCitation').find('DateCreated').find('Year').text
        month = pubmed_article.find('MedlineCitation').find('DateCreated').find('Month').text
        day = pubmed_article.find('MedlineCitation').find('DateCreated').find('Day').text
        CreatedDate = year + month + day
        for mesh_heading in pubmed_article.find('MedlineCitation').find('MeshHeadingList').findall('MeshHeading'):
            MeSH = mesh_heading.find('DescriptorName').text
            IsMajor = mesh_heading.find('DescriptorName').get('MajorTopicYN')
            line_to_write = ArticleID + '|' + CreatedDate + '|' + MeSH + '|' + IsMajor + '\n'
            f.write(line_to_write)

2.4 保存数据

最后,您可以使用 ElementTree 库来保存数据到 XML 文件中。

tree.write('data.xml')

这将保存 ElementTree 对象到 XML 文件中。