您有一个包含如下 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 & 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 文件中。