私はpythonでlxmlライブラリを使って、GoogleのデータAPIのいくつかを使っています。名前空間はここでは大変面倒です。私がやっている仕事の多くは(主にxpathのもの)、それらを無視するだけでいいのです。lxmlのすべての名前空間を削除しますか?
python/lxmlでxml名前空間を無視する簡単な方法はありますか?
ありがとうございました!
私はpythonでlxmlライブラリを使って、GoogleのデータAPIのいくつかを使っています。名前空間はここでは大変面倒です。私がやっている仕事の多くは(主にxpathのもの)、それらを無視するだけでいいのです。lxmlのすべての名前空間を削除しますか?
python/lxmlでxml名前空間を無視する簡単な方法はありますか?
ありがとうございました!
要素と属性からすべての名前空間を削除する場合は、次のコードを参考にしてください。
コンテキスト:私のアプリケーションでは、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>
=====================================================================
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メソッドの存在はどちらかをテストします。
関連:[XSL変換を介して名前空間を削除](http://stackoverflow.com/a/4256126/4279)印刷
– jfs