2010-01-28 102 views
1

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

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标准,但对我无能为力,因为我无法控制它。这是我的情况,我必须处理它。除了用手转换每个特殊字符以外的任何想法?

+0

我试图编辑你的问题,但我不知道我明白你想要什么。请更具体地说明在什么条件下您想查看哪些实际字节。你想看到&符号吗? – bmargulies 2010-01-28 22:05:59

+1

您的意思是"或其他字符,因为"e;是XML标准的一部分,所以任何软件都应该能够处理这个问题。如果它不符合标准,那么它会出错, – Mark 2010-01-28 22:16:57

+0

这看起来不像是你的目标的问题。唯一预定义的实体是&,<和>。 "被广泛使用,但仍未预定义,只有在DTD声明它时才存在。 – 2010-02-04 20:47:56

回答

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的问题无关,因为他的目标宣称其不符合该建议书。

Ari。

+0

如果只有它带有文档...这是通过反复试验发现的。感谢您的建议。 – Marshmellow1328 2010-03-03 16:19:30

0

据我所知,标准API不公开escape机制。您可能需要编写自己的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。)