【问题标题】:Ant / XML escaping a standalone Quotation Mark in a property valueAnt / XML 转义属性值中的独立引号
【发布时间】:2018-11-06 09:27:47
【问题描述】:

在我的 ant 构建文件中有一个属性:

<property name="pwd" value="" description="value set external"/>

此属性由用户通过 GUI 设置。 稍后我想调用一个java任务并将属性“pwd”的值作为参数传递给java类:

<java classname="package.and.classname" dir="${directory}" fork="yes" failonerror="true">
     <arg line="-u ${user}"/> 
     <arg line="-p ${pwd}"/> 
     <classpath>
        <pathelement path="[...]"/>            
     </classpath>
  </java>

在用户拥有包含单引号 (') 或单双引号 (") 的密码之前,此方法可以正常工作。

-p pass'word 中的不平衡引号

好的 - 简单的解决方法:

     <arg line="-p &quot;${pwd}&quot;"/> 

但下一种情况是 pwd = pass"word。然后错误: "The syntax of the command is incorrect." 如果同时使用 (' 和 ") 会发生什么?

我试图用&amp;quot; 和/或&amp;apos; 转义引号,但最终行为并没有真正改变。 即使我将每个参数的&lt;arg line&gt;&lt;arg value&gt; 交换,问题仍然存在(但实际上现在仅用于双引号或混合大小写)。

例如:

<arg value="-u"/>
<arg value="${user}"/>
<arg value="-p"/>
<arg value="${pwd}"/> 

可以使用pwd=pass'word,但不能使用pwd=pass"wordpwd=pass&amp;quot;word

有什么方法可以告诉 ant pwd 的值不应该被计算?

【问题讨论】:

  • 我已经为此工作了几天,但我想不出解决方案。我唯一想到的是,您能否在设置密码时以某种方式处理密码,而不是在使用密码时?这是我唯一能想到的尝试。
  • "命令的语法不正确。"可能是 Windows shell 错误消息。可能值得在详细模式下运行 Ant 以确切了解 java fork 是如何被调用的,以防万一那里有一个“额外的 shell 层”在 args 上绊倒。

标签: xml ant escaping quotation-marks


【解决方案1】:

只需对带有 ", f.e.: 的属性值使用单引号:

<project> 
   <property name="foo" value='b"ar'/>
    <echo>$${foo} => ${foo}</echo>
</project>

输出

[echo] ${foo} => b"ar

编辑

混合大小写

<project> 
   <property name="foo" value="b&quot;a&apos;r"/>
   <echo>$${foo} => ${foo}</echo>
</project>

输出

[echo] ${foo} => b"a'r

似乎 ant 能够处理这种混合大小写,但您的 Java 类不能。

编辑

这样的课程

public class Foobar
{
  public static void main(String[] args)
  {
    System.out.println("args[0] => " + args[0] );
    System.out.println("args[1] => " + args[1] );
    System.out.println("args[2] => " + args[2] );
  }
}

还有这个蚂蚁脚本:

<project>   
 <java classname="Foobar" classpath=".">
   <arg value="b&quot;a&apos;r"/> 
   <arg value="ba&apos;r"/>
   <arg value="b&quot;ar"/>
 </java>  
</project>

一切正常,输出:

 [java] args[0] => b"a'r
 [java] args[1] => ba'r
 [java] args[2] => b"ar

注意 = 它只适用于 arg 值,f.e.:

<project>   
 <java classname="Foobar" classpath=".">
   <arg value="-p b&quot;a&apos;r"/> 
   <arg value="-p ba&apos;r"/>
   <arg value="-p b&quot;ar"/>
 </java>  
</project>

输出

 [java] args[0] => -p b"a'r
 [java] args[1] => -p ba'r
 [java] args[2] => -p b"ar

<project> 
 <java classname="Foobar" classpath=".">
   <arg line="-p b&quot;a&apos;r"/> 
   <arg line="-p ba&apos;r"/>
   <arg line="-p b&quot;ar"/>
 </java>
</project>

结果:

unbalanced quotes in -p b"a'r 

【讨论】:

  • 对不起 - 这不是我的问题的答案。我想同时处理:单引号和双引号。
  • @sarkasronie 要么是'..."...' 要么是 "...'..." 还是我做错了什么!?
  • 它可能是混合大小写(如上所述):pas"s'word
  • @sarkasronie 好的,您的帖子只提到了“混合大小写”,但没有进一步解释,现在很清楚了。
  • "如果同时使用 (' 和 ") 会发生什么?"
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多