Как извлечь конкретный контент из XML-файла с пространством имен в нем, собранный из API?Ниже детали - PullRequest
0 голосов
/ 26 октября 2018
<?xml version="1.0" encoding="UTF-8"?>
<service xmlns="http://www.w3.org/2005/app" xmlns:app="http://www.w3.org/2005/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://api*.successfactors.com/odata/v2/">
    <workspace>
        <atom:title>Default</atom:title>
        <collection href="User">
            <atom:title>User</atom:title>
        </collection>
        <collection href="FOLegalEntityLocalUSA">
            <atom:title>FOLegalEntityLocalUSA</atom:title>
        </collection>
        <collection href="DGFieldValue">
            <atom:title>DGFieldValue</atom:title>
        </collection>
        <collection href="NameFormatGO">
            <atom:title>NameFormatGO</atom:title>
        </collection>
    </workspace>
</service>

Я хочу извлечь значение (User, FOLegalEntityLocalUSA и т. Д.) Из.

from xml.etree.ElementTree as ET.
...
...
response = requests.get(url, auth=auth_values)
print (response.text)
doc = ET.fromstring(response.content)
namespaces= {'web':'http://www.w3.org/2005/app','atm':'http:   
//www.w3.org/2005/Atom'}
for work in doc.findall('web:workspace',namespaces):
   coll = work.find('web:collection',namespaces)
   for a in coll.findall('atm:title',namespaces):
      print (a.text)

Теперь печатается только первое единственное значение (atom: title) «Пользователь». Не знаю, как это сделать, чтобы получить все значения (atom: title).

Я испробовал все возможности извлечения названия. Пока не повезло. Я сейчас застрял и не знаю, что делать. Пожалуйста, помогите мне. Спасибо

1 Ответ

0 голосов
/ 26 октября 2018

Похоже, что в вашем примере XML отсутствует объявление пространства имен для префикса пространства имен atom.

Я полагаю, что содержание XML, отображаемое в вопросе, не является полным?( вопрос теперь обновлен, правильное содержимое XML )

Если предположить, что где-то есть объявление xmlns:atom="http://www.w3.org/2005/Atom", код для получения элемента atom:title должен быть:

for collection in d.findall('collection'):
    r = title.find('{http://www.w3.org/2005/Atom}title').text
    # or
    r = title.find('atom:title', namespaces={'atom': 'http://www.w3.org/2005/Atom'})

Обновление:

Вот как вы получаете все названия:

namespaces= {'app':'http://www.w3.org/2005/app','atom':'http://www.w3.org/2005/Atom'}

for workspace in doc.findall('app:workspace', namespaces):
    for collection in workspace.findall("app:collection", namespaces):
        for title in collection.findall("atom:title", namespaces):
            print(title.text)
...