我有一个需要打开并进行一些更改的xml文件,其中之一是删除名称空间和前缀,然后保存到另一个文件。这是xml:
<?xml version='1.0' encoding='UTF-8'?>
<package xmlns="http://apple.com/itunes/importer">
<provider>some data</provider>
<language>en-GB</language>
</package>
我可以进行所需的其他更改,但是找不到如何删除名称空间和前缀的方法。这是我需要的reusklt xml:
<?xml version='1.0' encoding='UTF-8'?>
<package>
<provider>some data</provider>
<language>en-GB</language>
</package>
这是我的脚本,它将打开并解析xml并将其保存:
metadata = '/Users/user1/Desktop/Python/metadata.xml'
from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
open(metadata)
tree = etree.parse(metadata, parser)
root = tree.getroot()
tree.write('/Users/user1/Desktop/Python/done.xml', pretty_print = True, xml_declaration = True, encoding = 'UTF-8')
那么,如何在脚本中添加代码以删除名称空间和前缀呢?
按照Uku
Loskit的建议替换标签。除此之外,请使用lxml.objectify.deannotate。
from lxml import etree, objectify
metadata = '/Users/user1/Desktop/Python/metadata.xml'
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(metadata, parser)
root = tree.getroot()
####
for elem in root.getiterator():
if not hasattr(elem.tag, 'find'): continue # (1)
i = elem.tag.find('}')
if i >= 0:
elem.tag = elem.tag[i+1:]
objectify.deannotate(root, cleanup_namespaces=True)
####
tree.write('/Users/user1/Desktop/Python/done.xml',
pretty_print=True, xml_declaration=True, encoding='UTF-8')
更新
一些标签,例如Comment
访问tag
属性时返回一个函数。为此增加了一个警卫。(1)
问题内容: 我正在尝试解析OpenOffice ODS电子表格中的内容。ods格式实质上只是一个带有许多文档的zip文件。电子表格的内容存储在“ content.xml”中。 电子表格的内容在一个单元格中: 我们也可以直接进入行: 各个元素都知道名称空间: 如何直接在find / findall中使用命名空间? 明显的解决方案不起作用。 尝试从表中获取行: 问题答案: 如果包含名称空间前缀,则可以
我有以下xml。 我想要的是 我想做的是只使用名称空间xmlns:i=”获取节点GetPatientTreatmentTeamResult下的文本(该节点在不同的调用中会有所不同)http://www.w3.org/2001/XMLSchema-instance(所有调用都有这个)并且不使用实际的节点名。 我尝试过使用XmlParser和XmlSlurper 但我一直没能得到我想要的结果。 我该怎
问题内容: 我有一个XML文档,我正在尝试使用Etree.lxml进行解析 我的代码是: 当我尝试获取dom.getroot()时,我得到: 但是我只想要: 当我做 我什么也得不到。但是,当我 我得到结果。 我认为将ns_clean = True传递给解析器将防止这种情况。 有任何想法吗? 问题答案: 您可以使用以下方法找到可识别名称空间的节点: 如果您确实要删除名称空间,则可以使用XSL转换:
问题内容: 我已经导入了WSDL并使用它发送SOAP请求。看起来像这样: 问题出在Calculate元素中。Web服务无法接受。Web服务不喜欢这样的名称空间… 使用SoapUI,我发现此请求可以正常工作: 那么,如何将请求从第一个版本更改为第二个版本?(不使用肮脏的把戏!) (如果会导致正确的请求格式,则重新导入不是问题。) 再说一遍:不允许使用任何肮脏的技巧,例如入侵请求流以对其进行修改! 尽
我有以下肥皂反应作为示例: 在soapenv:Envelope中,urn:mycompany:Customer:2已包含为urn1,但在ns3:Channel和ns3:Value中重复。 要求是清理xml内容,以便在子元素中使用soapenv:Envelope中声明的正确名称空间。 Java有没有办法清理/规范化这个xml内容并使用正确的命名空间使用和重复删除?
问题内容: 我有以下格式的xml文档: 我需要使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。 我尝试过的各种方法是: 要么 要么 在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。 问题答案: 这样的事情应该起作用: 另请参见http://lxml.de/xpathxslt.html#namespaces-and- pr