如何获取 xml 文件中子字段节点的数量

How to get the amount of subfield nodes in a xml file

我正在尝试从 xml 文件中提取数据。我通过将先前生成的 url 访问到 xml 提供商的 api 来获取 xml 文件。通常我需要的数据域只出现一次,但有时,数据域节点会出现多次。

这是我使用的代码:(这只是代码的一部分,所以缩进可能有点不对)

from urllib.request import urlopen
import pandas as pd
import xml.etree.ElementTree as ET
    with urlopen(str(row)) as response:
                    doc = ET.parse(response)  
                    root = doc.getroot()
                    namespaces = {  
                "zs": "http://www.loc.gov/zing/srw/",
                "": "http://www.loc.gov/MARC21/slim",
                    }
                datafield_nodes_path = "./zs:records/zs:record/zs:recordData/record/datafield"  # XPath
                datafield_attribute_filters = [ #which fields to extract
                {
                "tag": "100", #author
                "ind1": "1",
                "ind2": " ",
                }]      
                no_aut = True
                for datafield_node in root.iterfind(datafield_nodes_path, namespaces=namespaces):
                    if any(datafield_node.get(k) != v for attr_dict in datafield_attribute_filters for k,v in attr_dict.items()):
                        continue
                    
                    for subfield_node in datafield_node.iterfind("./subfield[@code='a']", namespaces=namespaces):
                        clean_aut.append(subfield_node.text) #this gets the author name
                        no_aut = False
                if no_aut: clean_aut.append(None)

这对我访问的 URL 中的 80% 工作正常,但其余 20% 要么损坏,要么有多个 subfield_nodes 用于我正在搜索的 datafield_attribute_filter

这是一个 URL 多次出现的示例:example link

当这个 URL 被加载到 urlopen 时,我得到了作者九次而不是一次。 有没有办法计算出现的次数,如果 datafield_node 出现不止一次,只取第一次出现的 datafield_node? 我尝试使用 ET 的 findall 但没有得到可用的结果。

感谢任何帮助

虽然这不是我想要的解决方法,但还是成功了:

append_author=0
no_aut = True
   for datafield_node in root.iterfind(datafield_nodes_path, namespaces=namespaces):
   if any(datafield_node.get(k) != v for attr_dict in datafield_attribute_filters for k,v in attr_dict.items()):
                        continue
   if append_author ==0
       for subfield_node in datafield_node.iterfind("./subfield[@code='a']", namespaces=namespaces):
       clean_aut.append(subfield_node.text) #this gets the author name
       no_aut = False
       append_author+=1

添加第一个字段后,将跳过其他字段