代码之家  ›  专栏  ›  技术社区  ›  Ian Gilham

如何在XML元素中包含文本模式,除非它已经在某个XML元素中?

  •  0
  • Ian Gilham  · 技术社区  · 17 年前

    我有几千个XML文件从Java属性文件中生成,这些文件是为TTX格式编写的。它们包含了相当多的变量,我需要保护它们不受译者的影响,因为它们经常会破坏这些变量。变量的形式是数字,或者偶尔是大括号之间的文本,例如0,this。

    如果这些变量还不是属性,并且还不是内部文本的一部分,那么我需要用XML元素将它们包围起来。 美国犹他州 元素,就像这样:

    <ut DisplayText="{0}">&lt;{0}&gt;</ut>
    

    我的输入如下:

    <ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
    <ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
    <ut DisplayText="\n">&lt;\n/&gt;</ut> {2}.
    <ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>
    

    正确的输出应该是:

    <ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
    <ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
    <ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>.
    <ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>
    

    我最初的方法是使用一个正则表达式来匹配大括号中的术语,并用模式替换围绕它构建XML元素。当在上面的第一个代码块中发现模式时,这种方法失败。

    以前的查找和替换模式(在记事本+中):

    发现

    ({[A-Za-z0-9]*})
    

    替换

    <ut DisplayText="\1">\1</ut>
    

    现在看来,regex不是合适的工作工具,所以我想对更好的方法、不同的工具,甚至是更完整的regex提出一些建议,让我可以快速、重复地解决这个问题。

    更新: 这个问题比先前预想的要复杂一些。似乎还有更多的东西需要保护,包括一些相当模糊的语法,在看起来像某种条件语句的内容中混合变量和文本。从内存:

    {o,choice|1#1  error|1&lt;{0,number,integer} errors}
    

    其中“错误”和“错误”是可翻译的,不应受到保护。目前我们拥有的最简单的解决方案是运行上面的regex,修复它创建的少数错误,然后为更复杂的项目运行一些更普通的find&replace过程。它可以抽象为regex,但现在这样做没有什么意义。

    除了所提供的改进表达式之外,我还感谢指向XSLT和其他具有更好regex支持的编辑器的指针。在时间允许的情况下,我会有一些选择。

    3 回复  |  直到 14 年前
        1
  •  1
  •   John    17 年前

    如果我的假设是错误的,请告诉我,但从您的示例来看,您似乎希望更改而不是<ut>元素中的文本。对我来说,这似乎是XSLT的一个简单用法。只需输出UT元素,并处理其中的任何文本。

        2
  •  0
  •   Mentee    17 年前

    这将找到有1个或多个字母或数字,并且当此模式跟随标记和任意数量的空格,并跟随任意数量的空格和换行符时。

        3
  •  0
  •   Ian Gilham    14 年前