如何在 Python ElementTree 声明 xml 后删除换行符?
How to remove the newline after xml declaration by Python ElementTree?
我正在将 xml 写入字符串,这是包含声明的代码
updatedxml = ET.tostring(root, encoding="utf8", method="xml").decode()
输出(声明后加换行)
<?xml version='1.0' encoding='utf8'?>
<manifest>...</manifest>
updatedxml
稍后在解析为 JSON
之前使用 json dumps
序列化
print(json.dumps(updatedxml))
并且输出中有一个“\n”,有什么 pythonic 方法可以摆脱它吗?
"<?xml version='1.0' encoding='utf8'?>\n<manifest>...</manifest>"
所以发生这种情况的原因是因为下面的 toString 方法的 ElementTree 实现在内部调用了 write 方法,如下所示:
def tostring(element, encoding=None, method=None, *, short_empty_elements=True):
stream = io.StringIO() if encoding == 'unicode' else io.BytesIO()
ElementTree(element).write(stream, encoding, method=method, short_empty_elements=short_empty_elements)
return stream.getvalue()
def write(self, file_or_filename, encoding=None, xml_declaration=None, default_namespace=None, method=None, *,
if not method:
method = "xml"
elif method not in _serialize:
raise ValueError("unknown method %r" % method)
if not encoding:
if method == "c14n":
encoding = "utf-8"
else:
encoding = "us-ascii"
enc_lower = encoding.lower()
with _get_writer(file_or_filename, enc_lower) as write:
if method == "xml" and (xml_declaration or (xml_declaration is None and enc_lower not in ("utf-8", "us-ascii", "unicode"))):
declared_encoding = encoding
if enc_lower == "unicode":
# Retrieve the default encoding for the xml declaration
import locale
declared_encoding = locale.getpreferredencoding()
write("<?xml version='1.0' encoding='%s'?>\n" % (declared_encoding,))
if method == "text":
_serialize_text(write, self._root)
else:
qnames, namespaces = _namespaces(self._root, default_namespace)
serialize = _serialize[method]
serialize(write, self._root, qnames, namespaces, short_empty_elements=short_empty_elements)
你可以看到“\n”是通过这个write方法写入的。
最简单的方法是去掉后面的“\n”。
print("".join(json.dumps(updatedxml).split("\n")))
如果您只想替换“\n”的第一个实例,请执行以下操作:
print(json.dumps(updatedxml).replace("\n", "", 1))
如果你想删除所有换行符,你可以使用 python 的 string.replace()
print(json.dumps(updatedxml).replace("\n", ""))
要删除 <manifest>
之前的换行符但保留所有其他换行符,获取它的索引然后从输出中排除该字符
dump = json.dumps(updatedxml)
idx = dump.index("\n<manifest>")
print(dump[:idx] + dump[idx+1:])
既然你要求 pythonic 方式,我想你可以使用列表理解,尽管上面的方式可能更快,也更容易阅读。
dump = json.dumps(updatedxml)
print("".join([char for i, char in enumerate(dump) if i != dump.index("\n<manifest>")]))
我正在将 xml 写入字符串,这是包含声明的代码
updatedxml = ET.tostring(root, encoding="utf8", method="xml").decode()
输出(声明后加换行)
<?xml version='1.0' encoding='utf8'?>
<manifest>...</manifest>
updatedxml
稍后在解析为 JSON
json dumps
序列化
print(json.dumps(updatedxml))
并且输出中有一个“\n”,有什么 pythonic 方法可以摆脱它吗?
"<?xml version='1.0' encoding='utf8'?>\n<manifest>...</manifest>"
所以发生这种情况的原因是因为下面的 toString 方法的 ElementTree 实现在内部调用了 write 方法,如下所示:
def tostring(element, encoding=None, method=None, *, short_empty_elements=True):
stream = io.StringIO() if encoding == 'unicode' else io.BytesIO()
ElementTree(element).write(stream, encoding, method=method, short_empty_elements=short_empty_elements)
return stream.getvalue()
def write(self, file_or_filename, encoding=None, xml_declaration=None, default_namespace=None, method=None, *,
if not method:
method = "xml"
elif method not in _serialize:
raise ValueError("unknown method %r" % method)
if not encoding:
if method == "c14n":
encoding = "utf-8"
else:
encoding = "us-ascii"
enc_lower = encoding.lower()
with _get_writer(file_or_filename, enc_lower) as write:
if method == "xml" and (xml_declaration or (xml_declaration is None and enc_lower not in ("utf-8", "us-ascii", "unicode"))):
declared_encoding = encoding
if enc_lower == "unicode":
# Retrieve the default encoding for the xml declaration
import locale
declared_encoding = locale.getpreferredencoding()
write("<?xml version='1.0' encoding='%s'?>\n" % (declared_encoding,))
if method == "text":
_serialize_text(write, self._root)
else:
qnames, namespaces = _namespaces(self._root, default_namespace)
serialize = _serialize[method]
serialize(write, self._root, qnames, namespaces, short_empty_elements=short_empty_elements)
你可以看到“\n”是通过这个write方法写入的。
最简单的方法是去掉后面的“\n”。
print("".join(json.dumps(updatedxml).split("\n")))
如果您只想替换“\n”的第一个实例,请执行以下操作:
print(json.dumps(updatedxml).replace("\n", "", 1))
如果你想删除所有换行符,你可以使用 python 的 string.replace()
print(json.dumps(updatedxml).replace("\n", ""))
要删除 <manifest>
之前的换行符但保留所有其他换行符,获取它的索引然后从输出中排除该字符
dump = json.dumps(updatedxml)
idx = dump.index("\n<manifest>")
print(dump[:idx] + dump[idx+1:])
既然你要求 pythonic 方式,我想你可以使用列表理解,尽管上面的方式可能更快,也更容易阅读。
dump = json.dumps(updatedxml)
print("".join([char for i, char in enumerate(dump) if i != dump.index("\n<manifest>")]))