2017-06-07 11 views
1

Pythonのlxmlでxml要素をコメント化しても、コメント内の元の要素のレンダリングを維持できますか?私は以下を試しましたlxmlを使って要素をコメントアウトする

しかし、tostring()は、名前空間宣言を追加します。

+0

どの名前空間宣言? [mcve]を入力してください。 – mzjn

+0

mzjn:xmlns = "foo"など。元のxmlでは、これらの宣言はルート要素から継承され、子要素には明示的に存在しません。もちろん、tostring()はそのことを知らない。 – BlindDriver

+0

OK、わかりました。しかし、私はまだ問題を示す完全な例を要求することは妥当であると考えています。今私は私の答えの例を提供しました。 – mzjn

答えて

2

コメントアウトされた要素の名前空間は、ルート要素から継承されます。デモ:

from lxml import etree 

XML = """ 
<root xmlns='foo'> 
<a> 
    <b>AAA</b> 
</a> 
</root>""" 

root = etree.fromstring(XML) 
b = root.find(".//{foo}b") 
b.getparent().replace(b, etree.Comment(etree.tostring(b))) 
print etree.tostring(root) 

結果:

<root xmlns="foo"> 
<a> 
    <!--<b xmlns="foo">AAA</b> 
--></a> 
</root> 

は、名前空間を操作するには、多くの場合、あなたは疑うかもしれないよりも難しいです。 https://stackoverflow.com/a/31870245/407651を参照してください。ここ

私の提案は(soup.find('b')はそれがfoo名前空間にあるにもかかわらずb要素を返します)実際には、実際に名前空間を気にしないBeautifulSoupを、使用することです。

from bs4 import BeautifulSoup, Comment 

soup = BeautifulSoup(XML, "xml") 
b = soup.find('b') 
b.replace_with(Comment(str(b))) 
print soup.prettify() 

結果:

<?xml version="1.0" encoding="utf-8"?> 
<root mlns="foo"> 
<a> 
    <!--<b>AAA</b>--> 
</a> 
</root> 
関連する問題