XML xpath - передача значения, если элемент не найден - PullRequest
0 голосов
/ 14 января 2020

Я сейчас пытаюсь проанализировать файл XML, код ниже работает нормально, за исключением одной проблемы. В случае создаваемого мной списка полных имён это единственный тег, который не всегда появляется в каждом поддереве, т.е. типы user_names, profiles, & * authentication возвращают, скажем, 30 элементов, а full_name возвращает 27 .

Поэтому, когда я пытаюсь создать dataframe, я получаю ошибку, потому что списки имеют разную длину.

xmltree = ET.parse(xml)
namespaces = {'ns5':'urn:swift:saa:xsd:operator',
              'profile':'urn:swift:saa:xsd:operatorprofile'
             }

user_names = xmltree.xpath('//ns5:Identifier/ns5:Name/text()', namespaces=namespaces)
full_names = xmltree.xpath('//ns5:Description/text()', namespaces=namespaces)
profiles = xmltree.xpath('//profile:Name/text()', namespaces=namespaces)
authentication_types = xmltree.xpath('//ns5:AuthenticationType/text()', namespaces=namespaces)

xml = pd.DataFrame({'User_Name': user_names, 'Full_Name': full_names,
                    'Profile': profiles, 'Authentication_Type': authentication_types})

Есть ли способ сделать это так, чтобы dataframe мог быть создан с нулевыми значениями (или пробелами) в столбце полных имен?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я думал об этом прошлой ночью и понял, что мне нужно будет идентифицировать родительский тег и l oop, просматривая его, чтобы найти дочерние теги. Изменился мой подход, и теперь он работает так, как я хочу.

Для тех, кто сталкивается с проблемой, вот исправление, которое я использовал.

root = xmltree.getroot()

user_names = []
full_names = []
profiles = []
authentication_types = []

for i in root.findall('.//{urn:swift:saa:xsd:impex:operator}Operator'):
    usernames = i.find('.//{urn:swift:saa:xsd:operator}Name')
    usernames2 = "" if usernames is None else usernames.text
    user_names.append(usernames2)

    fullnames = i.find('{urn:swift:saa:xsd:operator}Description')
    fullnames2 = "" if fullnames is None else fullnames.text
    full_names.append(fullnames2)

    user_profiles = i.find('.//{urn:swift:saa:xsd:operatorprofile}Name')
    user_profiles2 = "" if user_profiles is None else user_profiles.text
    profiles.append(user_profiles2)

    authenications = i.find('{urn:swift:saa:xsd:operator}AuthenticationType')
    authenications2 = "" if authenications is None else authenications.text
    authentication_types.append(authenications2)

    xml = pd.DataFrame({'User_Name': user_names,
                        'Full_Name': full_names,
                        'Profile': profiles,
                        'Authentication_Type': authentication_types})
0 голосов
/ 14 января 2020

Попробуйте, не проверял ваш код, причина не в том, чтобы воспроизвести

full_names = xmltree.xpath('//ns5:Description/text()', namespaces=namespaces) if xmltree.xpath('//ns5:Description/text()', namespaces=namespaces) else ""

или один и тот же код в несколько строк

full_names = xmltree.xpath('//ns5:Description/text()', namespaces=namespaces)
if not full_name:
    full_names = ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...