无法从XML fi读取同级的同级和子级

2024-06-28 20:00:46 发布

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

我想从xml文件中读取PMID和author的名字,示例文件如下所示

我得到了PMID和名字,但是循环作为PMID的次数,我想要1个PMID和它们各自的名字

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE PubmedArticleSet SYSTEM "http://dtd.nlm.nih.gov/ncbi/pubmed/out/pubmed_190101.dtd">
<PubmedArticleSet>
<PubmedArticle>
    <MedlineCitation Status="MEDLINE" Owner="NLM">
        <PMID Version="1">2844048</PMID>
        <AuthorList CompleteYN="Y">
            <Author ValidYN="Y">
                <LastName>Guarner</LastName>
                <ForeName>J</ForeName>
                <Initials>J</Initials>
            </Author>
            <Author ValidYN="Y">
                <LastName>Cohen</LastName>
                <ForeName>C</ForeName>
                <Initials>C</Initials>
            </Author>
            <Author ValidYN="Y">
                <LastName>Mushi</LastName>
                <ForeName>E</ForeName>
                <Initials>F</Initials>
            </Author>
        </AuthorList>
    </MedlineCitation>
</PubmedArticle>
<PubmedArticle>
    <MedlineCitation Status="MEDLINE" Owner="NLM">
        <PMID Version="1">123456</PMID>
        <AuthorList CompleteYN="Y">
            <Author ValidYN="Y">
                <LastName>Smith</LastName>
                <ForeName>C</ForeName>
                <Initials>C</Initials>
            </Author>
            <Author ValidYN="Y">
                <LastName>Jones</LastName>
                <ForeName>E</ForeName>
                <Initials>F</Initials>
            </Author>
        </AuthorList>
    </MedlineCitation>
</PubmedArticle>
</PubmedArticleSet>

密码,我试过了

FN=[]
for pmid in root.iter('PMID'):
    print(pmid.text)
    for id in root.findall("./PubmedArticle/MedlineCitation/Article/AuthorList"):
        for f in id.findall("./Author/ForeName"):
            fn=f.text

            x= '{},{}'.format(i, fn)
            #print(x)
            FN.append(x)

预期产量

PMID               AUTHORS
2844048            'Guarner J J', 'Cohen C C'

Tags: 文件inforxml名字authorlastnameinitials
1条回答
网友
1楼 · 发布于 2024-06-28 20:00:46

我不知道你是否想输出一个特定的格式。但是,您可以尝试以下代码。输出是一个字典,其中键是PMID,值是作者列表。你知道吗

import xml.etree.ElementTree as ET
import pandas as pd
tree = ET.parse('E:\Python\DataFiles\PMID.xml') # change according to your location
authors_pmid = []
all_authors_pmid = []
root = tree.getroot()
for amedlinecitation in root.iter('MedlineCitation'): #PMID and Author are childs of MedlineCitation
    pmid = amedlinecitation.find('PMID').text
    for anauthor in amedlinecitation.iter('Author'): # for each amedlinecitation, find all its Authors
        author_name = anauthor.find('LastName').text # for each Author, find the LastName tag and extract its value
        authors_pmid = [pmid,author_name]
        all_authors_pmid.append(authors_pmid)
df = pd.DataFrame(all_authors_pmid,columns=['PMID','Author'])
print(df)

输出:

{'2844048': ['Guarner', 'Cohen', 'Mushi'], '123456': ['Smith', 'Jones']}

下面的代码将使用Python数据帧以表格形式给出输出。你知道吗

import xml.etree.ElementTree as ET
import pandas as pd
tree = ET.parse('E:\Python\DataFiles\PMID.xml') # change according to your location
authors_pmid = []
all_authors_pmid = []
root = tree.getroot()
for amedlinecitation in root.iter('MedlineCitation'): #PMID and Author are childs of MedlineCitation
    pmid = amedlinecitation.find('PMID').text
    for anauthor in amedlinecitation.iter('Author'): # for each amedlinecitation, find all its Authors
        author_name = anauthor.find('LastName').text # for each Author, find the LastName tag and extract its value
        authors_pmid = [pmid,author_name]
        all_authors_pmid.append(authors_pmid)
df = pd.DataFrame(all_authors_pmid,columns=['PMID','Author'])
print(df)

输出:

      PMID   Author
0  2844048  Guarner
1  2844048    Cohen
2  2844048    Mushi
3   123456    Smith
4   123456    Jones

上述代码与第一个代码有何不同:

  1. 对于每对PMID和Author name,它将创建一个列表。此列表名为authors\u pmid。例如,['2844048','Guarner'],['2844048','Cohen'],['2844048','Mushi'],['123456','Smith'],['123456','Jones']将是内部For循环每次迭代期间列表变量authors\u pmid中的值。你知道吗
  2. 然后,上述每个列表都将附加到所有作者定义的最终列表中
  3. 最后一个列表将是对Dataframe构造函数的调用的数据输入,以创建列名称为:PMID和Author的Dataframe

相关问题 更多 >