如何用Python解析Desc XML文件生成仅含内容的MeSH概念树视图?
解决MeSH Desc XML解析树视图显示XML标签的问题
问题背景
解析MeSH的Desc XML文件生成概念树视图时,输出结果包含XML标签名或元素对象信息,需要改为只显示标签内的文本内容。
示例场景
示例XML片段
<DescriptorRecord> <DescriptorName> <String>Neoplasms</String> </DescriptorName> <TreeNumberList> <TreeNumber>C04</TreeNumber> </TreeNumberList> <ConceptList> <Concept> <ConceptName> <String>Neoplasms</String> </ConceptName> </Concept> </ConceptList> </DescriptorRecord>
原错误代码(输出带标签)
import xml.etree.ElementTree as ET def build_tree(element, indent=0): print(" " * indent + str(element)) for child in element: build_tree(child, indent + 1) tree = ET.parse('desc2024.xml') root = tree.getroot() build_tree(root)
解决方案
核心思路
递归遍历XML元素时,提取元素的文本内容(而非元素对象或标签名),同时可通过筛选标签只保留MeSH树的核心信息。
基础版:提取所有非空白文本
import xml.etree.ElementTree as ET def build_mesh_tree(element, indent=0): # 提取并清理文本内容 text = element.text.strip() if element.text else "" if text: print(" " * indent + text) # 递归处理子元素 for child in element: build_mesh_tree(child, indent + 1) # 解析XML文件 tree = ET.parse('desc2024.xml') root = tree.getroot() # 生成纯文本树视图 build_mesh_tree(root)
精准版:只保留MeSH核心节点
如果只需要Descriptor名称、树编号、概念名称等关键信息,可针对性筛选标签:
import xml.etree.ElementTree as ET def build_targeted_mesh_tree(element, indent=0): # 定义需要保留的核心标签 target_tags = {'DescriptorName', 'String', 'TreeNumber', 'ConceptName'} if element.tag in target_tags: text = element.text.strip() if element.text else "" if text: print(" " * indent + text) for child in element: build_targeted_mesh_tree(child, indent + 1) tree = ET.parse('desc2024.xml') root = tree.getroot() build_targeted_mesh_tree(root)
注意事项
- 如果XML包含命名空间,需先注册命名空间避免标签前缀问题:
ET.register_namespace('', 'http://www.nlm.nih.gov/mesh') - 使用
strip()去除文本前后的换行、缩进等空白字符,让树视图更整洁
内容的提问来源于stack exchange,提问作者CrazyHero
相关产品推荐
相关产品推荐

