通过java编写xml时处理特殊字符

时间:2012-05-04 19:46:25

标签: java special-characters

通过java程序,我正在创建一个xml的股票持有者。生成的xml看起来像 -

<?xml version="1.0" encoding="UTF-8" ?>
<urlset>
<url>
 <loc>FirstName-LastName/id/</loc>
</url>
</urlset>

有一些股票持有人在其名称中有特殊字符,例如A.Pitkänen。现在,当我看到这个股票持有人的xml看起来像 -

<?xml version="1.0" encoding="UTF-8" ?>
<urlset>
<url>
<loc>/A-Pitk寥n/ELS_1005091/</loc>
</url>
</urlset>

这使得xml无效。为什么会这样? java程序是 -

FileWriter fstream = new FileWriter("c:\stock-holders.xml");
final BufferedWriter out = new BufferedWriter(fstream);

try {
    // Making Connection and query the stock holders to get the resultset

        String aId = "";
        String aFName = "";
        String aLName = "";

        out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
        out.write("<urlset>\n");

        while (rs.next()) {
            String url = "";

            aFName = rs.getString(2);
            if (StringUtils.isNotEmpty(aFName) ) {
                aFName = aFName.trim();
                url += aFName;
            }

            aLName = rs.getString(3);
            if (StringUtils.isNotEmpty(aLName)) {
                aLName = aLName.trim();
                url += "-" + aFName;

            }

            aId = rs.getString(1);
            if (StringUtils.isNotEmpty(aId)) {
                aId = aId.trim();
                url += "/" + aId + "/";
            }

            out.write("<url>\n");
            out.write("<loc>" + url + "</loc>\n");
            out.write("</url>\n");
            out.flush();
        }
        out.write("</urlset>");
        out.close();
    }

3 个答案:

答案 0 :(得分:3)

Sicne你的XML文件应该用UTF-8编码编写,你需要配置你的Writer来使用那个编码而不是系统默认编码:

FileOutputStream fstream = new FileOutputStream("c:\stock-holders.xml"); 
OutputStreamWriter writer = new OutputStreamWriter(fstream, "UTF-8");
final BufferedWriter out = new BufferedWriter(writer); 

请注意,出于这个原因,不建议使用FileWriter - 它不能配置为使用默认编码以外的编码。

此外,也许最好使用一些现有的API来构造XML文件(例如DOM或StAX),而不是通过字符串连接来实现。例如,您的解决方案没有考虑到您的数据可能包含XML中非法的字符,应该进行转义。

答案 1 :(得分:1)

我怀疑问题是你正在使用FileWriter而不是连接一个OutputStreamWriter的FileOutputStream,其中OSW指定“utf-8”作为编码

答案 2 :(得分:0)

你可以使用更短的东西:

PrintWriter out = new PrintWriter("c:\\stock-holders.xml", "UTF-8");

此构造函数自Java 1.5起可用。

文档说:

  

使用。创建一个没有自动行刷新的新PrintWriter   指定的文件名和字符集。这个便利构造函数创建   必要的中间OutputStreamWriter,它将编码   使用提供的字符集的字符。

完成所有flush()次调用后,您需要调用方法write