在python中迭代XML标记中的所有子标记和字符串,而不指定子标记名
我的问题是来自的附加问题,但我不打算使用附加问题的答案部分 如果我有如下XML文件的一部分:在python中迭代XML标记中的所有子标记和字符串,而不指定子标记名,python,xml,parsing,Python,Xml,Parsing,我的问题是来自的附加问题,但我不打算使用附加问题的答案部分 如果我有如下XML文件的一部分: <eligibility> <criteria> <textblock> Inclusion Criteria: - women undergoing cesarean section for any indication - literate in german language
<eligibility>
<criteria>
<textblock>
Inclusion Criteria:
- women undergoing cesarean section for any indication
- literate in german language
Exclusion Criteria:
- history of keloids
- previous transversal suprapubic scars
- known patient hypersensitivity to any of the suture materials used in the protocol
- a medical disorder that could affect wound healing (eg, diabetes mellitus, chronic
corticosteroid use)
</textblock>
</criteria>
<gender>Female</gender>
<minimum_age>18 Years</minimum_age>
<maximum_age>45 Years</maximum_age>
<healthy_volunteers>No</healthy_volunteers>
</eligibility>
我的问题是我有很多文件。有时,XML文件的结构可能是:
eligibility -> criteria -> textblock -> text
eligibility -> other things (e.g. gender as above) -> text
eligibility -> text
e、 g。
如果有什么办法,只要“把所有的副标题和它们的文本都记下来”
因此,在上述示例中,列表/字典将包含:
{标准文本框:纳入和排除标准,性别:xxx,最低年龄:xxx,最高年龄:xxx,健康志愿者:xxx}
我的问题是,事实上,我不知道合格标签的所有具体子标签,因为每个实验可能不同(例如,可能有人说“孕妇接受”、“XXX接受药物史”等)
所以我只想,如果我给它一个标签名,它会给我字典中所有的子标签和这些子标签的文本
用于注释的扩展XML:
<brief_title>Subcutaneous Adaption and Cosmetic Outcome Following Caesarean Delivery</brief_title>
<source>Klinikum Klagenfurt am Wörthersee</source>
剖宫产术后皮下适应与美容效果
克林库姆·克拉根福·阿姆·沃瑟西酒店
…然后是上面的合格性XML部分。既然您已经安装了
lxml
,您可以尝试以下操作(此代码假设给定元素中的叶元素,即合格性
是唯一的):
XPath解释:
:查找当前/*
中的所有元素,无论其深度(合格性
)和标记名(/
)*
:将前一位找到的元素筛选为没有任何子元素(即叶元素)的元素[非(*)]
后代或self:*[not(*)]
我发现我缺少一些已解析的数据,因为一些标记看起来像这样:60
;在标签有属性的地方,我想把单词60(如果可能的话,还有'actual',但这可能太难了)。如果有帮助,我可以在这里发布完整的代码和XML文件。我认为总体思路是,我需要编辑上面的代码片段,以查看标记(例如,此处注册)是否有属性(例如,enrollment.attrib[any attribute]然后打印标签、属性和值?我想检查这是否是正确的想法,因为我无法让它工作。lxml
元素模型中的属性只是一个字典,因此您可以从给定元素获取属性值,如:my_element.attrib[“attribute_name”]
。无论如何,您应该为此发布一个新问题,确保包含有代表性的XML示例和您尝试的代码
<brief_title>Subcutaneous Adaption and Cosmetic Outcome Following Caesarean Delivery</brief_title>
<source>Klinikum Klagenfurt am Wörthersee</source>
from lxml import etree
tree = etree.parse(sys.argv[1])
root = tree.getroot()
eligibi = []
for eligibility in root.xpath('//eligibility'):
d = {}
for e in eligibility.xpath('.//*[not(*)]'):
d[e.tag] = e.text
eligibi.append(d)
print eligibi