我如何使用命名空间解析 xml 文件?

How do i parse xml file with namespace?

我已经完成了以下编码,但不知道为什么会出现空数据帧。

     <Report xmlns="urn:crystal-reports:schemas:report-detail"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
        <Details Level="1">
        <Field Name='ReportNo'><Value>90</Value>
ns = {"urn:crystal-reports:schemas:report-detail#"}


def test(xml_file, df_cols):
    global df
    xtree = et.parse(xml_file)
    xroot = xtree.getroot()
    out_xml = pd.DataFrame(columns=df_cols)

    for node in xroot.findall("urn:Group[1]/Details/Field", ns):
        name = node.attrib.get("Name")
        value = node.find("Value").text

您粘贴的 XML 片段不符合您的查询,它缺少您正在寻找的 <Group> 元素。

无论哪种方式,您都需要

  • 有一个正确的命名空间 map (dict) – 你目前有一个只有一个条目的集合
  • 需要用真正的冒号 : 分隔命名空间别名,而不是全角冒号
  • 在查询的 每个 元素以及值子节点查询上都有命名空间。

这里我选择r("report"的缩写)作为urn:crystal-reports:schemas:report-detail的别名。如果你不想使用别名,你也可以使用普通语法 {urn:crystal-reports:schemas:report-detail}Group 等,在这种情况下你不需要命名空间映射。

所有这些都解决了,我们得到了类似

的东西
import xml.etree.ElementTree as et

data = """<?xml version="1.0"?>
<Report xmlns="urn:crystal-reports:schemas:report-detail" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
  <Group>
      <Details Level="1">
        <Field Name="ReportNo"><Value>90</Value></Field>
        <Field Name="Other"><Value>644</Value></Field>
      </Details>
  </Group>
</Report>
"""

nsmap = {"r": "urn:crystal-reports:schemas:report-detail"}
xroot = et.XML(data)  # could read from file here

for node in xroot.findall("r:Group/r:Details/r:Field", nsmap):
    name = node.attrib.get("Name")
    value = node.find("r:Value", nsmap).text
    print(name, value)

这里的输出是

ReportNo 90
Other 644

– 将其插入数据框作为练习留给 reader。