lxml etree xmlparser 删除不需要的命名空间
我有一个 xml 文档,我试图使用 Etree.lxml 解析它,
<Envelope xmlns="http://www.example.com/zzz/yyy">
<Header>
<Version>1</Version>
</Header>
<Body>
some stuff
<Body>
<Envelope>
我的代码是:
path = "path to xml file"
from lxml import etree as ET
parser = ET.XMLParser(ns_clean=True)
dom = ET.parse(path, parser)
dom.getroot()
当我尝试获取 dom.getroot() 时,我得到:
<Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>
但是我只想:
<Element Envelope at 28adacac>
当我这样做时,
dom.getroot().find("Body")
我什么也没有返回。然而,当我
dom.getroot().find("{http://www.example.com/zzz/yyy}Body")
得到结果时。
我认为将 ns_clean=True 传递给解析器可以防止这种情况。
有什么想法吗?
I have an xml doc that I am trying to parse using Etree.lxml
<Envelope xmlns="http://www.example.com/zzz/yyy">
<Header>
<Version>1</Version>
</Header>
<Body>
some stuff
<Body>
<Envelope>
My code is:
path = "path to xml file"
from lxml import etree as ET
parser = ET.XMLParser(ns_clean=True)
dom = ET.parse(path, parser)
dom.getroot()
When I try to get dom.getroot() I get:
<Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>
However I only want:
<Element Envelope at 28adacac>
When i do
dom.getroot().find("Body")
I get nothing returned. However, when I
dom.getroot().find("{http://www.example.com/zzz/yyy}Body")
I get a result.
I thought passing ns_clean=True to the parser would prevent this.
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
来自 https://bitbucket.org/olauzanne/pyquery/issue/17 的最后一个解决方案可以帮助您轻松避免命名空间
在您的情况下,请尝试 xml.replace(' xmlns="' , ' xmlnamespace="')。但是,如果正文中也需要字符串,则可能需要更复杂的东西。
The last solution from https://bitbucket.org/olauzanne/pyquery/issue/17 can help you to avoid namespaces with little effort
In your case, try
xml.replace(' xmlns="', ' xmlnamespace="')
. However, you might need something more complex if the string is expected in the bodies as well.另一个不错的选择是使用 QName 帮助器并将其包装在具有默认命名空间的函数中:
Another not-too-bad option is to use the QName helper and wrap it in a function with a default namespace:
您正在显示 repr() 调用的结果。当您以编程方式浏览树时,您可以简单地选择忽略名称空间。
You're showing the result of the repr() call. When you programmatically move through the tree, you can simply choose to ignore the namespace.
您可以使用
xpath
方法找到命名空间感知节点:如果您确实想要删除命名空间,您可以使用 XSL 转换:
这里我们看到命名空间已被删除:
所以您现在可以找到主体节点这样:
You can find namespace-aware nodes using the
xpath
method:If you really want to remove namespaces, you could use an XSL transformation:
Here we see the namespace has been removed:
So you can now find the Body node this way:
尝试使用 Xpath:
取自(并简化)此页面,位于“The xpath() method”下部分
Try using Xpath:
Taken (and simplified) from this page, under "The xpath() method" section