2012-02-16 42 views
4

私はpythonでlxmlライブラリを使って、GoogleのデータAPIのいくつかを使っています。名前空間はここでは大変面倒です。私がやっている仕事の多くは(主にxpathのもの)、それらを無視するだけでいいのです。lxmlのすべての名前空間を削除しますか?

python/lxmlでxml名前空間を無視する簡単な方法はありますか?

ありがとうございました!

+3

関連:[XSL変換を介して名前空間を削除](http://stackoverflow.com/a/4256126/4279)印刷

def dropns(root): for elem in root.iter(): parts = elem.tag.split(':') if len(parts) > 1: elem.tag = parts[-1] entries = [] for attrib in elem.attrib: if attrib.find(':') > -1: entries.append(attrib) for entry in entries: del elem.attrib[entry] # Test case name = '~/tmp/mantisbt/test.xml' f = open(name, 'rb') import lxml.etree as etree parser = etree.XMLParser(ns_clean=True, recover=True) root = etree.parse(f, parser=parser) print('=====================================================================') print etree.tostring(root, pretty_print = True) print('=====================================================================') dropns(root) print etree.tostring(root, pretty_print = True) print('=====================================================================') 

jfs

答えて

1

要素と属性からすべての名前空間を削除する場合は、次のコードを参考にしてください。

コンテキスト:私のアプリケーションでは、SOAP応答ストリームのXML表現を取得していますが、クライアント側でオブジェクトを構築することには興味がありません。 XML表現だけに興味があります。さらに、私は、ネームスペースのものには興味がありません。私の目的のために、必要以上に複雑なものになってしまいます。だから、単に要素から名前空間を削除し、名前空間を含むすべての属性を削除します。

===================================================================== 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ns1:mc_issue_getResponse> 
     <return xsi:type="tns:IssueData"> 
     <id xsi:type="xsd:integer">356</id> 
     <view_state xsi:type="tns:ObjectRef"> 
      <id xsi:type="xsd:integer">10</id> 
      <name xsi:type="xsd:string">public</name> 
     </view_state> 
    </return> 
    </ns1:mc_issue_getResponse> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
===================================================================== 
<Envelope> 
    <Body> 
    <mc_issue_getResponse> 
     <return> 
     <id>356</id> 
     <view_state> 
      <id>10</id> 
      <name>public</name> 
     </view_state> 
    </return> 
    </mc_issue_getResponse> 
</Body> 
</Envelope> 
===================================================================== 
-1

lxml some_element.tagは、{namespace-uri}local-nameのような文字列で、名前空間がある場合はlocal-nameとなります。非要素ノード(コメントなど)では非文字列値であることに注意してください。

これを試してみてください:Pythonのオン

for node in some_tree.iter(): 
    startswith = getattr(node 'startswith', None) 
    if startswith and startswith('{'): 
     node.tag = node.tag.rsplit('}', 1)[-1] 

タグはASCIIバイト文字列またはUnicode文字列のいずれかになりますから2.x。 startswithメソッドの存在はどちらかをテストします。

関連する問題