Как разобрать xml с атрибутом xmlns, используя python - PullRequest
0 голосов
/ 30 августа 2018
<?xml version="1.0" ?>

<school xmlns="loyo:22:2.2">
    <profile>
        <student xmlns="loyo:5:542">
            <marks>
                <mark java="java:/lo">
                    <ca1>200</ca1>
                </mark>
            </marks>
        </student>
    </profile>
</school>

Я пытаюсь получить доступ к тексту ca1 . Я использую etree, но не могу получить к нему доступ. Я использую приведенный ниже код.

import xml.etree.ElementTree as ET
tree = ET.parse('mca.xml')
root = tree.getroot()

def getElementsData(xpath):
    elements = list()
    if root.findall(xpath):
        for elem in root.findall(xpath):
            elements.append(elem.text)
        return elements
    else:
        raise SystemExit("Invalid xpath provided")



t = getElementsData('.//ca1')
for i in t:
    print(i)

Я пытался по-другому получить к нему доступ, я не знаю точную проблему. Это проблема типа файла записи?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Попробуйте следующий xpath

tree.xpath('//ca1//text()')[0].strip()
0 голосов
/ 30 августа 2018

Ваш документ имеет пространства имен на узлах школа и ученик , вам необходимо включить пространства имен в свой поиск. Так как вы ищете ca1 , который находится под student , вам необходимо указать пространство имен, которое имеет student узел:

import xml.etree.ElementTree as ET
tree = ET.parse('mca.xml')
root = tree.getroot()

def getElementsData(xpath, namespaces):
    elements = root.findall(xpath, namespaces)
    if elements == []:
        raise SystemExit("Invalid xpath provided")
    return elements


namespaces = {'ns_school': 'loyo:22:2.2', 'ns_student': 'loyo:5:542'}
elements = getElementsData('.//ns_student:ca1', namespaces)

for element in elements:
    print(element)

Примечания

  • Поскольку ваши пространства имен не имеют имен, я дал им такие имена, как ns_school , ns_student , но эти имена могут быть любыми (например, ns1 , * 1023). * mystudent , ...)
  • В более сложной системе я рекомендую вызывать некоторые другие виды ошибок и позволить вызывающей стороне решать, выходить или нет.
0 голосов
/ 30 августа 2018

Как насчет прохождения вот так

import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('test.xml').getroot()
data = e.getchildren()[0].getchildren()[0].getchildren()[0].getchildren()[0].getchildren()[0].text
print(data)
...