使用ascii编码而不是字符实体编码xml

时间:2010-01-28 22:03:15

标签: java xml ascii character-entities

好的,所以这是我的问题。我需要在Java中生成xml以传递到另一个应用程序。我开始认为使用org.w3c.dom.Document很容易。不幸的是,我需要将XML传递给需要的应用程序需要特殊的字符,例如“需要编码为ASCII(")而不是它们的字符实体(& quot;)。有没有人知道一个简单的解决方案?

P.S。无法更改目标应用程序。

更新: 所以,假设我的应用程序被赋予以下字符串作为输入:

he will "x" this if needed

我的应用需要输出:

<field value="he will &#034;x&#034; this if needed"/>

我正在使用的XML生成器,我猜大多数其他人都输出了这个,但这对我的目标无效:

<field value="he will &quot;x&quot; this if needed"/>

我意识到我的目标可能不太符合XML标准,但这对我没有帮助,因为我无法控制它。这是我的情况,我必须处理它。除了简单地手工转换每个特殊字符之外的任何想法吗?

2 个答案:

答案 0 :(得分:2)

我想知道如何将XML序列化 - 字符串,流等。您可以对输出进行后处理,以用其等价的数字替换通用实体引用,例如,

sed 's/&lt;/\&#60;/g; s/&gt;/\&#62;/g; s/&amp;/\&#38;/g; s/&apos;/\&#39/g; s/&quot;/\&#34;/g'

xmlResultString.replaceAll("&lt;", "&#60;"); //etc. for other entities

XML中只有5个预定义的通用实体(http://www.w3.org/TR/REC-xml/#sec-predefined-ent),您可以安全地将其作为文本替换来执行。除了引用之外没有任何修改任何东西的危险(好吧,可能在注释和PI中,但听起来不像你的场景使用它们,或者目标甚至接受它们)。

我同意Mark您的目标应用程序不是一致的XML处理器。至少它带有文档,明确说明它与XML的区别。我认为该建议书(上面的链接)不同意克里斯托弗的评论,尽管它与OP的问题无关,因为他的目标宣称其不符合建议书。

阿里。

答案 1 :(得分:0)

据我所知,标准API不公开转义机制。您可能需要编写自己的XML发射器。

如果您不介意第三方API,可以使用JDOM。类似的东西:

XMLOutputter outputter = new XMLOutputter() {
  @Override
  public String escapeAttributeEntities(String sequence) {
    // TODO: bug: code only works for Basic Multilingual Plane
    StringBuilder out = new StringBuilder();
    for (int i = 0; i < sequence.length(); i++) {
      process(sequence.charAt(i), out);
    }
    return out.toString();
  }

  private void process(char codePoint, StringBuilder out) {
    if (codePoint == '"' || codePoint == '\'' || codePoint == '&'
        || codePoint == '<' || codePoint == '>' || codePoint > 127) {
      out.append("&#");
      out.append(Integer.toString(codePoint));
      out.append(";");
    } else {
      out.append(codePoint);
    }
  }
};
outputter.setFormat(Format.getPrettyFormat().setEncoding("US-ASCII"));

Element foo = new Element("foo").setAttribute("msg",
    "he will \"x\" this if needed");
Document doc = new Document().setRootElement(foo);
outputter.output(doc, System.out);

这会发出:

<?xml version="1.0" encoding="US-ASCII"?>
<foo msg="he will &#34;x&#34; this if needed" />

(在执行此操作之前,我仍然会为XML spec提供一次性操作,并修复字符处理以支持字符above U+FFFF。)