xml.etree.ElementTree findall 函数 returns 路径为空字符串 python
xml.etree.ElementTree findall function returns empty string for path python
给定 XML 作为字符串:
xml_as_string = """<root xmlns:SOAP-ENV="http://w/e">
<Context operation="something.wsdl">
<SOAP_Version>123.321</SOAP_Version>
<Namespace xmlns:SOAP-ENV="http://dummy.com"/>
</Context>
<Header/>
<Body>
<ns2:Complex xmlns:ns2="http://www.test.this/idk">
<ns2:simple>
<ns2:child1>IKM</ns2:child1>
<ns2:child2>1234</ns2:child2>
<ns2:child3>S</ns2:child3>
</ns2:simple>
<ns2:simple>
<ns2:child1>QEw</ns2:child1>
<ns2:child2>10028111</ns2:child2>
<ns2:parentchild1>IKM</ns2:parentchild1>
<ns2:parentchild2>1234</ns2:parentchild2>
<ns2:child3>S</ns2:child3>
</ns2:simple>
<ns2:simple>
<ns2:child1>IOW</ns2:child1>
<ns2:child2>100043896</ns2:child2>
<ns2:parentchild1>QEw</ns2:parentchild1>
<ns2:parentchild2>10028111</ns2:parentchild2>
</ns2:simple>
<ns2:extra>
<ns2:childextra>0</ns2:childextra>
</ns2:extra>
</ns2:Complex>
</Body>
</root>
"""
正在使用 xml.etree.ElementTree 创建 xml 树:
`import xml.etree.ElementTree as ET`
root = ET.fromstring(xml_as_string)
对于特定路径,我正在尝试打印找到的所有值
path = './Body/Complex/simple/child1'
path_vals = root.findall(path)
print([e.text for e in path_vals])
结果是一个空列表:
[]
在 python 中有什么方法可以做到这一点吗?
您可能想要与 child1 关联的所有文本:您需要使用 namespace 来获取数据:“http://www.test.this/idk”是命名空间
namespace = '{http://www.test.this/idk}'
[ent.text for ent in root.findall(F".//{namespace}child1")]
['IKM', 'QEw', 'IOW']
如果您想取消名称空间,可以 parsel 试试看:
from parsel import Selector
selector = Selector(xml_as_string, 'xml')
#remove namespace
selector.remove_namespaces()
#get your required text
selector.xpath(".//child1/text()").getall()
['IKM', 'QEw', 'IOW']
给定 XML 作为字符串:
xml_as_string = """<root xmlns:SOAP-ENV="http://w/e">
<Context operation="something.wsdl">
<SOAP_Version>123.321</SOAP_Version>
<Namespace xmlns:SOAP-ENV="http://dummy.com"/>
</Context>
<Header/>
<Body>
<ns2:Complex xmlns:ns2="http://www.test.this/idk">
<ns2:simple>
<ns2:child1>IKM</ns2:child1>
<ns2:child2>1234</ns2:child2>
<ns2:child3>S</ns2:child3>
</ns2:simple>
<ns2:simple>
<ns2:child1>QEw</ns2:child1>
<ns2:child2>10028111</ns2:child2>
<ns2:parentchild1>IKM</ns2:parentchild1>
<ns2:parentchild2>1234</ns2:parentchild2>
<ns2:child3>S</ns2:child3>
</ns2:simple>
<ns2:simple>
<ns2:child1>IOW</ns2:child1>
<ns2:child2>100043896</ns2:child2>
<ns2:parentchild1>QEw</ns2:parentchild1>
<ns2:parentchild2>10028111</ns2:parentchild2>
</ns2:simple>
<ns2:extra>
<ns2:childextra>0</ns2:childextra>
</ns2:extra>
</ns2:Complex>
</Body>
</root>
"""
正在使用 xml.etree.ElementTree 创建 xml 树:
`import xml.etree.ElementTree as ET`
root = ET.fromstring(xml_as_string)
对于特定路径,我正在尝试打印找到的所有值
path = './Body/Complex/simple/child1'
path_vals = root.findall(path)
print([e.text for e in path_vals])
结果是一个空列表:
[]
在 python 中有什么方法可以做到这一点吗?
您可能想要与 child1 关联的所有文本:您需要使用 namespace 来获取数据:“http://www.test.this/idk”是命名空间
namespace = '{http://www.test.this/idk}'
[ent.text for ent in root.findall(F".//{namespace}child1")]
['IKM', 'QEw', 'IOW']
如果您想取消名称空间,可以 parsel 试试看:
from parsel import Selector
selector = Selector(xml_as_string, 'xml')
#remove namespace
selector.remove_namespaces()
#get your required text
selector.xpath(".//child1/text()").getall()
['IKM', 'QEw', 'IOW']