<p><code>"\001"</code>aka“\x01”是ASCII控制代码。但它不是允许的XML字符之一。唯一的<a href="http://www.w3.org/TR/REC-xml/#NT-Char" rel="nofollow">ASCII control codes which qualify</a>是“\t”、“\n”和“\r”。在</p>
<p>示例:</p>
<pre><code>>>> import xml.etree.cElementTree as ET
# Raw newline works
>>> t = ET.fromstring("<e>\n</e>")
>>> t.text
'\n'
# Hex escaping of a newline works
>>> t = ET.fromstring("<e>&#xa;</e>")
>>> t.text
'\n'
# Hex escaping of "\x01" doesn't work; it's not a valid XML character
>>> t = ET.fromstring("<e>&#x1;</e>")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 106, in XML
cElementTree.ParseError: reference to invalid character number: line 1, column 3
</code></pre>
<p>如果希望在XML文档中以某种方式包含无效的XML字符,则必须通过额外的转义级别将它们从XML解析器中隐藏起来。该机制需要被文档化、发布并被文档的读者理解。在</p>
<p>例如,在microsoftexcel2007+XLSX文件中,无效XML字符的Unicode代码点通过将它们表示为<code>_xhhhh_</code>而<code>hhhh</code>是代码点的十六进制表示形式,从而被偷运通过解析器。在您的示例中,这将是7个字节<code>_x0001_</code>。注意,必须转义文本中的任何<code>_</code>字符,否则这些字符将被错误地解释为引入<code>_xhhhh_</code>序列。在</p>
<p>这是丑陋的,痛苦的,低效的,等等。你可以考虑其他方法。有必要使用XML吗?会是CSV文件(震惊,恐怖!)在你的申请中做得更好?在</p>
<p><strong>编辑</strong>关于OP编码方案的一些注释:</p>
<p>A.虽然<code>\r</code>是一个有效的XML1.0输入字符,但它受<a href="http://www.w3.org/TR/2006/REC-xml-20060816/#sec-line-ends" rel="nofollow">mandatory immediate transmogrification</a>的约束,因此您也应该对其进行转义。在</p>
<p>B.此方案假设/希望<code><u>hhhh</u></code>不能与任何其他标记混淆。在</p>
<p>我收回我上面所说的微软逃逸计划。它相对美观、无痛、高效。为了让温顺的读者了解你的计划,你应该展示一些必要的代码,以消除这些讨厌的部分,然后把它们粘在一起。请记住,MS方案需要某人编写一个转义函数和一个非转义函数,而您的方案需要对每个工具(SAX、DOM、ElementTree)进行不同的处理。在</p>
<p>D.在细节层面,代码有点模糊:</p>
<p><code>if (len(g1) > 0):</code>应该是<code>if g1:</code></p>
<p><code>if (not foo == None):</code>与普遍接受的习惯用法有三个偏差:(1)括号(2)<code>not x == y</code>而不是{<cd13>}(3)<code>!= None</code>而不是{<cd15>}</p>
<p>不要使用<code>list</code>(以及其他内置对象的名称)作为自己变量的名称。在</p>
<p><strong>编辑2</strong>要使用正则表达式拆分字符串。为什么不使用<a href="http://docs.python.org/library/re.html#re.split" rel="nofollow">re.split</a>?在</p>
^{pr2}$