如何使用python解析具有xmlns属性的xml

时间:2018-08-30 11:36:02

标签: python xpath elementtree

<app-analytics *ngIf="userPreferences$ | async as userPreferences" [userPreferences]="userPreferences"></app-analytics>

我试图访问 ca1 文本。我正在使用etree,但无法访问它。我正在使用下面的代码。

<?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>

我尝试了其他方式来访问它,但我不知道确切的问题。录制文件类型有问题吗?

3 个答案:

答案 0 :(得分:1)

您的文档在学校学生节点上具有名称空间,您需要在搜索中合并名称空间。由于您要查找学生下的 ca1 ,因此需要指定学生节点具有的名称空间:

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 mystudent ,...)
  • 在更复杂的系统中,我建议您提出一些其他类型的错误,并让呼叫者决定是否退出。

答案 1 :(得分:0)

如何遍历这样

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)

答案 2 :(得分:-1)

尝试以下xpath

tree.xpath('//ca1//text()')[0].strip()