【问题标题】:XML Escape Characters in JavaJava 中的 XML 转义字符
【发布时间】:2015-08-05 05:56:26
【问题描述】:

我有一个要写入 xml 的对象。 xml 有转义字符,如“&”、“

我有这样的输入 xml

<?xml version="1.0" encoding="UTF-8"?>
<personName><firstName>Sam & Pat </firstName>
<sal> > than 10000 </sal>
</personName>

并且预期的xml应该是`

<?xml version="1.0" encoding="UTF-8"?>
<personName><firstName>Sam &amp; Pat </firstName>
<sal> &lt; than 10000 </sal>
</personName>

如果我使用 StringUtils,它会像这样转换所有“

&lt;sal&gt; &lt; than 10000 &lt;/sal&gt;

编辑:我实际上不能使用 JaxB。我正在使用 FreeMarkerTemplate 来执行此操作。这是代码。

File tempFile = File.createTempFile(fileName, ".tmp");
try (FileWriter writer = new FileWriter(tempFile)) {
freeMarkerConfig.setOutputEncoding(UTF_8);
    Template template = freeMarkerConfig.getTemplate(templateName);
    template.process(data, writer);
}              `                                                                                                    
The resultant file which get created should have the handled escape characters.

【问题讨论】:

  • 添加一个您想要实现的具体示例。输入和输出。请阅读stackoverflow.com/help/how-to-ask
  • 嗨,我已经添加了示例。
  • IMO 阅读完此线程后,我相信您的来源应该负责发送有效的 XML 文件。您可以根据需要对数据进行编码、转义,但您不必担心有效的 XML 结构。

标签: java xml


【解决方案1】:

您也可以使用Apache Commons Lang Library 转义字符:

例子:

    String escapeString1 = "Sam & Pat ";
    System.out.println("Escaped : " + StringEscapeUtils.escapeXml11(escapeString1));

    String escapeString2 = " > than 10000";
    System.out.println("Escaped : " + StringEscapeUtils.escapeXml11(escapeString2));

输出:

Escaped : Sam &amp; Pat 
Escaped :  &gt; than 10000

【讨论】:

  • StringEscapeUtils 如果它只是一个字符串就可以使用。但是使用这个 api 的 xml 字符串会转换每次出现的 '' 这使得它成为格式错误的 xml。示例:- <?xml version="1.0" encoding="UTF-8"?> <personName> <firstName>Sam &帕特</firstName> </人名> <萨尔> <超过 10000 </sal>
【解决方案2】:

您可以使用 JAXB 生成 XML。使用 @XmlRootElement 注释您的模型类

然后您可以使用 JAXB 来编组 XML-Object:

try {
  JAXBContext context = JAXBContext.newInstance(Person.class);

  Marshaller m = context.createMarshaller();
  m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

  Person object = new Person();
  object.setPersonName("Sam & Pat");
  object.setSal("> than 10000");

  m.marshal(object, System.out);
} catch (JAXBException e) {
  e.printStackTrace();
}

输出将是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <personName>Sam &amp; Pat</personName>
    <sal>&gt; than 10000</sal>
</person>

【讨论】:

  • 我不能使用 JaxB,因为我们必须使用 FreeMarkerTemplate 来生成基于 *.ftl 模板的 xml 文件。我为此添加了上面的代码。我找不到任何使用 freemarker 实现的方法。
【解决方案3】:

使用CDATA 将解决您的问题。

&lt;![CDATA[abc]]&gt;

【讨论】:

  • 我不确定如何使用 CDATA,因为我们从客户端获取 XML 并且我们无法更改它。你能详细说明一下吗?
【解决方案4】:

您可以在 XPL 中包含 XML 特殊字符。 XPL 具有与 XML 完全相同的结构,但允许在文本字段中使用特殊字符。 http://hll.nu/

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多