Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中迭代XML标记中的所有子标记和字符串,而不指定子标记名_Python_Xml_Parsing - Fatal编程技术网

在python中迭代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

我的问题是来自的附加问题,但我不打算使用附加问题的答案部分

如果我有如下XML文件的一部分:

  <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解释:

  • /*
    :查找当前
    合格性
    中的所有元素,无论其深度(
    /
    )和标记名(
    *
  • [非(*)]
    :将前一位找到的元素筛选为没有任何子元素(即叶元素)的元素

请允许我问一下,我很抱歉,我没有意识到您的代码意味着我无法同时打印只有一个深度的元素(例如,请参阅问题底部的编辑;一些XML文件是按资格嵌套的,但其他文件与上面的简短标题不同)。使用您的方法,我无法打印简短的标题或源,因为我正在筛选出子元素。在这种情况下,您是否建议我以某种方式运行此函数两次,一次如上所述,然后一次删除子节点的过滤器,以便获得深度仅为1的标记?感谢尝试将xpath更改为包含当前上下文元素(self):
后代或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