代码之家  ›  专栏  ›  技术社区  ›  Marshmellow1328

使用ASCII编码而不是字符实体编码XML

  •  1
  • Marshmellow1328  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  2
  •   iter    15 年前

    我想知道如何将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 )您可以安全地将其作为文本替换来执行。除了引用之外,它修改任何东西都没有危险(可能是在注释和pis中,但听起来不像您的场景使用它们,或者目标甚至接受它们)。

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

    Ari。

        2
  •  0
  •   McDowell rahul gupta    15 年前

    据我所知,标准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 。)