Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在XML文件中存储VT100转义码_Python_Xml_Unicode_Tty_Vt100 - Fatal编程技术网

Python 在XML文件中存储VT100转义码

Python 在XML文件中存储VT100转义码,python,xml,unicode,tty,vt100,Python,Xml,Unicode,Tty,Vt100,我正在编写一个Python程序,它记录终端交互,类似于脚本程序,我希望以XML格式存储日志 问题在于终端交互包括VT100转义码。如果我以UTF-8编码方式将数据写入文件,Python不会抱怨,例如: ... pid, fd = pty.fork() if pid==0: os.execvp("bash",("bash","-l")) else: # Lots of TTY-related stuff here # see http://groups.google.com

我正在编写一个Python程序,它记录终端交互,类似于脚本程序,我希望以XML格式存储日志

问题在于终端交互包括VT100转义码。如果我以UTF-8编码方式将数据写入文件,Python不会抱怨,例如:

...
pid, fd = pty.fork()
if pid==0:
    os.execvp("bash",("bash","-l"))
else:
    # Lots of TTY-related stuff here
    # see http://groups.google.com/group/comp.lang.python/msg/de40b36c6f0c53cc
    fout = codecs.open("session.xml", encoding="utf-8", mode="w")
    fout.write('<?xml version="1.0" encoding="UTF-8"?>\n')
    fout.write("<session>\n")
    ...
    r, w, e = select.select([0, fd], [], [], 1)
    for f in r:
        if f==fd:
            fout.write("<entry><![CDATA[")
            buf = os.read(fd, 1024)
            fout.write(buf)
            fout.write("]]></entry>\n")
        else:
            ....
    fout.write("</session>")
    fout.close()
该脚本的工作原理是将文件写入磁盘,但生成的文件不是正确的utf-8,这会导致像etree这样的XML解析器在转义码上呕吐


解决这一问题的一种方法是首先。但是,如果可以这样做,即维护转义码,并使用etree之类的XML工具解析生成的文件,那又有什么可能呢

您是否尝试将数据放入CDATA区域?这将防止解析器尝试读取标记的内容


您的问题不是控制代码不是正确的UTF-8,而是ASCII ESC和friends不是正确的XML字符,即使在CDATA区域内也是如此


XML 1.0中值小于U+0020的唯一有效XML字符是U+0009制表符、U+000A换行符和U+000D回车符。如果您想记录涉及其他代码(如escape U+001B)的内容,则必须以某种方式将其转义。没有其他选择。

正如Charles所说,大多数控制代码可能根本不包含在XML 1.0文件中

但是,如果您能够接受XML 1.1的要求,您可以在那里使用它们。它们不能作为原始字符包含,但可以作为字符引用。例如:

&#27;
因为您不能在CDATA节中写入字符引用,它们只会被解释为符号和散列-…,所以您必须丢失包装器并手动将&字符转义到它们的实体引用等价物中

请注意,您无论如何都应该这样做:CDATA部分并不免除您对文本转义的责任,因为如果序列中包含文本,它们将失败]]>。由于您总是需要进行一些转义,这使得CDATA部分在大多数情况下都毫无用处


XML 1.1在控制代码方面更为宽松,但并不是所有东西都支持它,而且仍然不能包含NUL字符&0;。一般来说,在XML中包含控制字符不是一个好主意。您可以使用一个特殊的编码方案来适应二进制文件;base-64很流行,但不是很容易让人阅读。如果只有您自己的应用程序才会处理这些文件,或者将它们编码为元素,例如。

是的,我确实尝试将数据放在CDATA区域中,但这不起作用。我将编辑上面的示例代码以反映这一点。错误答案:解析器确实读取CDATA部分的内容,并检查它是否只包含不包含ESC字符的合法XML字符。