如何解决将XML文件转换为Python中的列表列表
我有一个来自HMDB和Saliva Metabolites
数据的数据集。
此数据是XML文件。我想做的就是用Python将这个XML文件转换为列表列表(嵌套列表),但是,我不希望列表中的所有节点。
已编辑:这是一种代谢物的部分数据的示例
<?xml version="1.0" encoding="UTF-8"?>
<hmdb xmlns="http://www.hmdb.ca">
<metabolite>
<version>4.0</version>
<creation_date>2005-11-16 15:48:42 UTC</creation_date>
<update_date>2019-01-11 19:13:56 UTC</update_date>
<accession>HMDB0000001</accession>
<status>quantified</status>
<secondary_accessions>
<accession>HMDB00001</accession>
<accession>HMDB0004935</accession>
<accession>HMDB0006703</accession>
<accession>HMDB0006704</accession>
<accession>HMDB04935</accession>
<accession>HMDB06703</accession>
<accession>HMDB06704</accession>
</secondary_accessions>
<name>1-Methylhistidine</name>
<cs_description>1-Methylhistidine,also known as 1-mhis,belongs to the class of organic compounds known as histidine and derivatives. Histidine and derivatives are compounds containing cysteine or a derivative thereof resulting from reaction of cysteine at the amino group or the carboxy group,or from the replacement of any hydrogen of glycine by a heteroatom. 1-Methylhistidine has been found in human muscle and skeletal muscle tissues,and has also been detected in most biofluids,including cerebrospinal fluid,saliva,blood,and feces. Within the cell,1-methylhistidine is primarily located in the cytoplasm. 1-Methylhistidine participates in a number of enzymatic reactions. In particular,1-Methylhistidine and Beta-alanine can be converted into anserine; which is catalyzed by the enzyme carnosine synthase 1. In addition,Beta-Alanine and 1-methylhistidine can be biosynthesized from anserine; which is mediated by the enzyme cytosolic non-specific dipeptidase. In humans,1-methylhistidine is involved in the histidine metabolism pathway. 1-Methylhistidine is also involved in the metabolic disorder called the histidinemia pathway.</cs_description>
<description>One-methylhistidine (1-MHis) is derived mainly from the anserine of dietary flesh sources,especially poultry. The enzyme,carnosinase,splits anserine into b-alanine and 1-MHis. High levels of 1-MHis tend to inhibit the enzyme carnosinase and increase anserine levels. Conversely,genetic variants with deficient carnosinase activity in plasma show increased 1-MHis excretions when they consume a high meat diet. Reduced serum carnosinase activity is also found in patients with Parkinson's disease and multiple sclerosis and patients following a cerebrovascular accident. Vitamin E deficiency can lead to 1-methylhistidinuria from increased oxidative effects in skeletal muscle. 1-Methylhistidine is a biomarker for the consumption of meat,especially red meat.</description>
<synonyms>
<synonym>(2S)-2-amino-3-(1-Methyl-1H-imidazol-4-yl)propanoic acid</synonym>
<synonym>1-Methylhistidine</synonym>
<synonym>Pi-methylhistidine</synonym>
<synonym>(2S)-2-amino-3-(1-Methyl-1H-imidazol-4-yl)propanoate</synonym>
<synonym>1 Methylhistidine</synonym>
<synonym>1-Methyl histidine</synonym>
</synonyms>
<chemical_formula>C7H11N3O2</chemical_formula>
<smiles>CN1C=NC(C[C@H](N)C(O)=O)=C1</smiles>
<inchikey>BRMWTNUJHUMWMS-LURJTMIESA-N</inchikey>
<diseases>
<disease>
<name>Kidney disease</name>
<omim_id/>
<references>
<reference>
<reference_text>McGregor DO,Dellow WJ,Lever M,George PM,Robson RA,Chambers ST: Dimethylglycine accumulates in uremia and predicts elevated plasma homocysteine concentrations. Kidney Int. 2001 Jun;59(6):2267-72.</reference_text>
<pubmed_id>11380830</pubmed_id>
</reference>
<reference>
<reference_text>Ehrenpreis ED,Salvino M,Craig RM: Improving the serum D-xylose test for the identification of patients with small intestinal malabsorption. J Clin Gastroenterol. 2001 Jul;33(1):36-40.</reference_text>
<pubmed_id>11418788</pubmed_id>
</reference>
<reference>
</reference>
</references>
</disease>
<disease>
导入文件:
import xml.etree.ElementTree as et
data1 = et.parse('D:/path/to/Tal/my/HMDB/DataSets/saliva_metabolites/saliva_metabolites.xml')
root = data1.getroot()
现在,不确定如何选择特定节点。意思是,我的目标是创建一个代谢物列表,列表中的每个代谢物都将包含一个节点列表(例如<accession>
,<name>
,<synonyms>
和<diseases_name>
)
依次,这些元素将包含另一个列表(例如,在<synonyms>
内将有一个值名称列表,或者在<diseases_name>
内将是疾病名称列表,每种疾病都将包含pub_id值的列表)。
# To access the 4'th node of the first metabolit
>> root[0][3].text
'HMDB0000001'
其中root[0][3]
代表<accession>
节点。
试图通过打印来运行循环,所以我会理解循环的输出,但收到None
的列表
for node in root:
print(node.find('accession'))
None
None
None
None
None
.
.
.
也尝试过
>> root.findall('./metabolite/accession')
[]
但收到空括号
获取我尝试过的第一个代谢产物的同义词列表:
>> root[0][9].text
'\n '
# This gave the first value of synonyms
root[0][9][0].text
'\n '
我用这些问题来找到答案:
- How do I parse XML in Python?
- how to create a list of elements from an XML file in python
- Python: XML file to pandas dataframe
- Convert XML into Lists of Tags and Values with Python
- Generating nested lists from XML doc
任何提示,想法都会有所帮助,谢谢您的宝贵时间
解决方法
您将忽略XML中的名称空间。
<hmdb xmlns="http://www.hmdb.ca">
表示没有<hmdb>
元素。 <hmdb>
名称空间中有一个http://www.hmdb.ca
。并且由于这是该元素的默认名称空间,因此所有后代元素都位于同一名称空间中,除非它们将其覆盖。
所以这个
root.findall('./metabolite/accession')
将不会返回任何内容,因为您在错误的名称空间中搜索。
为方便起见,让我们在http://www.hmdb.ca
命名空间中进行句柄h
的搜索:
ns = {
"h": "http://www.hmdb.ca"
}
accession = root.findall('./h:metabolite/h:accession',ns)
print(accession)
这将找到一个元素(请参见在打印时如何明确表示名称空间):
[<Element '{http://www.hmdb.ca}accession' at 0x03E6E7B0>]
您可以在ElementTree中使用相同的显式语法,但是很快就会变得笨拙:
t.findall('./{http://www.hmdb.ca}metabolite/{http://www.hmdb.ca}accession')
使用prefix:
较短(标准)的语法可以更好地工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。