1

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

PS 更改目标应用程序不是一种选择。

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

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 标准,但这对我没有帮助,因为我无法控制它。这是我的情况,我必须处理它。除了简单地手动转换每个特殊字符之外还有什么想法吗?

4

2 回答 2

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

我同意 Mark 的观点,即您的目标应用程序不是符合标准的 XML 处理器。至少它附带的文档明确说明了它与 XML 的不同之处。我相信建议(上面的链接)不同意克里斯托弗的评论,尽管这与 OP 的问题无关,因为他的目标宣布其不符合建议。

阿里。

于 2010-02-13T01:52:14.123 回答
1

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

如果您不介意 3rd 方 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 规范,并修复字符处理以支持U+FFFF 以上的字符。)

于 2010-01-29T17:27:27.747 回答