我如何使用命名空间解析 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。
我已经完成了以下编码,但不知道为什么会出现空数据帧。
<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。