我想使用"findall"方法在ElementTree模块中找到源xml文件的一些元素.
但是,源xml文件(test.xml)具有命名空间.我将部分xml文件截断为样本:
<?xml version="1.0" encoding="iso-8859-1"?>
<XML_HEADER xmlns="http://www.test.com">
<TYPE>Updates</TYPE>
<DATE>9/26/2012 10:30:34 AM</DATE>
<COPYRIGHT_NOTICE>All Rights Reserved.</COPYRIGHT_NOTICE>
<LICENSE>newlicense.htm</LICENSE>
<DEAL_LEVEL>
<PAID_OFF>N</PAID_OFF>
</DEAL_LEVEL>
</XML_HEADER>
Run Code Online (Sandbox Code Playgroud)
示例python代码如下:
from xml.etree import ElementTree as ET
tree = ET.parse(r"test.xml")
el1 = tree.findall("DEAL_LEVEL/PAID_OFF") # Return None
el2 = tree.findall("{http://www.test.com}DEAL_LEVEL/{http://www.test.com}PAID_OFF") # Return <Element '{http://www.test.com}DEAL_LEVEL/PAID_OFF' at 0xb78b90>
Run Code Online (Sandbox Code Playgroud)
虽然它可以工作,因为有一个名称空间"{http://www.test.com}",在每个标记前面添加一个名称空间是非常不方便的.
使用"find","findall"等方法时,如何忽略命名空间?
我有一个xml doc,我试图使用Etree.lxml解析
<Envelope xmlns="http://www.example.com/zzz/yyy">
<Header>
<Version>1</Version>
</Header>
<Body>
some stuff
<Body>
<Envelope>
Run Code Online (Sandbox Code Playgroud)
我的代码是:
path = "path to xml file"
from lxml import etree as ET
parser = ET.XMLParser(ns_clean=True)
dom = ET.parse(path, parser)
dom.getroot()
Run Code Online (Sandbox Code Playgroud)
当我尝试获取dom.getroot()时,我得到:
<Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
但是我只想要:
<Element Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
当我做
dom.getroot().find("Body")
Run Code Online (Sandbox Code Playgroud)
我没有得到任何回报.但是,当我
dom.getroot().find("{http://www.example.com/zzz/yyy}Body")
Run Code Online (Sandbox Code Playgroud)
我得到了一个结果.
我认为将ns_clean = True传递给解析器会阻止这种情况.
有任何想法吗?