1
Pythonのlxmlでxml要素をコメント化しても、コメント内の元の要素のレンダリングを維持できますか?私は以下を試しましたlxmlを使って要素をコメントアウトする
しかし、tostring()
は、名前空間宣言を追加します。
Pythonのlxmlでxml要素をコメント化しても、コメント内の元の要素のレンダリングを維持できますか?私は以下を試しましたlxmlを使って要素をコメントアウトする
しかし、tostring()
は、名前空間宣言を追加します。
コメントアウトされた要素の名前空間は、ルート要素から継承されます。デモ:
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>
どの名前空間宣言? [mcve]を入力してください。 – mzjn
mzjn:xmlns = "foo"など。元のxmlでは、これらの宣言はルート要素から継承され、子要素には明示的に存在しません。もちろん、tostring()はそのことを知らない。 – BlindDriver
OK、わかりました。しかし、私はまだ問題を示す完全な例を要求することは妥当であると考えています。今私は私の答えの例を提供しました。 – mzjn