Python 要在xml标记中使用的转义字符串

Python 要在xml标记中使用的转义字符串,python,xml,Python,Xml,初步:这里没有回答这个问题: 实际问题: 我继承了一个xml模式,不幸的是它将xml本身的文件名编码为一个元素(我知道这是非常不寻常的,也不是一个好主意): 我的问题是,在Python中,是否有一种方法可以转义xml元素中不允许的任何字符。以某种透明的方式转义它将允许我在读取xml的工具中重建原始文件名 我可以使用这个标准来推出自己的产品:但我想知道,对于这样一个不寻常的案例,是否有现成的产品 附录:让我强调一下,这种构造是非常糟糕的样式,强烈建议重构文件格式,而不是找到解决方法。因此,我假设

初步:这里没有回答这个问题:

实际问题:

我继承了一个xml模式,不幸的是它将xml本身的文件名编码为一个元素(我知道这是非常不寻常的,也不是一个好主意):

我的问题是,在Python中,是否有一种方法可以转义xml元素中不允许的任何字符。以某种透明的方式转义它将允许我在读取xml的工具中重建原始文件名

我可以使用这个标准来推出自己的产品:但我想知道,对于这样一个不寻常的案例,是否有现成的产品

附录:让我强调一下,这种构造是非常糟糕的样式,强烈建议重构文件格式,而不是找到解决方法。因此,我假设在任何库中都没有现成的解决方案,因为构造本身违反了基本的xml设计准则


我发布了这个问题,以防确实存在解决方案,这样我就不必重新发明轮子了。如果没有其他问题,我将接受一个简单的“不存在”作为答案。

正如您所预期的,Python中没有现成的方法可以将文件名(无论是什么操作系统)中允许的字符映射到XML元素名中允许的字符。能够可逆地做到这一点将是另外一个挑战

正如您也承认的那样,XML设计是非传统的和有问题的,其原因仅从您当前遇到的关于允许字符的问题开始

建议,最佳优先:

  • 修复有问题的设计,即使这意味着修复上游和下游依赖关系

  • 将文件名映射到合法XML元素名的预处理和/或后处理

  • 设计并实现您心目中的可逆名称映射方案。这里的努力水平,再加上令人遗憾的以往设计错误的延续,使得这种方法没有吸引力

  • 另请参见


    我看到的一个惯例是用
    \uhhh\uhh
    替换所有“特殊”字符(对于“特殊”的某些定义),其中
    hhh
    是十六进制字符代码。但我不知道有哪个方便的图书馆能为你做这件事。如果把元素写成

    <file name="valid_filename_(but_invalid_xml).xml">
     ...
    </file>
    
    
    ...
    
    谢谢,这是一个非常有用的答案。我将重新评估中间解决方案的脏补丁(2/3)的实现与成本更高的重新设计(1)的好处之间的权衡,从长远来看,重新设计(1)是必须完成的。您的示例将是正确的xml方法(当然,除了在xml中包含文件名本身不是一个好主意,因为它引入了冗余)。如果绝对没有重构格式的选项,那么使用十六进制值作为解决方案似乎是一种很好的方法,但您必须添加一些标记来标识代码,以防文件名包含这些特定字符,或者您无法转换回。我想到了类似xml的ä;转录,但由于允许的字符集非常有限,没有很多好的编码选项。考虑到这一点,我怀疑是否有一种方法可以转义字符,以确保所有可能的文件名都可以转换,但仍然可以将它们转换回。唯一的选择是确保原始文件名不包含在某些字符组合中。由于这将是一个紧急修复,我想可能会强制执行。但在这一点上,这更像是一个尝试,因为它越来越清楚地表明,重构格式是唯一的出路。设计可逆编码并不难。如果
    \uuu
    是你的逃避特征呃,只要确保原始字符串中的任何
    \uuu
    本身都被视为特殊字符并转义即可。(我意识到,我原始答案中的下划线被误解为标记转义字符-这太过自我引用,令人不安)你当然是对的。这是因为我们可以假定unicode字符的长度是固定的,所以我们不需要终止符。我想我忽略了这一点,因为我们的文件名已经相当长,并且包含很多下划线,所以将它们加倍会使它们在xml中的长度更长。不过,这是完全可能的,你是正确的。
    <?xml version="1.0" encoding="utf-8"?>
    <valid_filename_(but_invalid_xml).xml>
        <content>
        </content>
    </valid_filename_(but_invalid_xml).xml>
    
    <file name="valid_filename_(but_invalid_xml).xml">
     ...
    </file>