0

通过一个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();
    }
4

3 回答 3

3

Sicne 您的 XML 文件应该以 UTF-8 编码编写,您需要将Writers 配置为使用该编码而不是系统默认编码:

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 中的非法字符并且应该转义。

于 2012-05-04T19:54:14.597 回答
1

我怀疑问题在于您使用的是 FileWriter 而不是 FileOutputStream 连接了 OutputStreamWriter,其中 OSW 将“utf-8”指定为编码

于 2012-05-04T19:52:31.570 回答
0

您可以使用更简短的内容:

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

此构造函数从 Java 1.5 开始可用。

文档说:

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

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

于 2012-05-04T20:02:47.027 回答