2012-05-04 72 views
0

通过java程序,我创建了一个xml的股票持有者。生成的XML看起来像 -在通过java编写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

Sicne您的XML文件应该以UTF-8编码写入,你需要配置Writer s到使用的编码,而不是系统默认的一个:

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

注意,不建议在此使用的FileWriter非常喜欢on - 它不能被配置为使用默认编码以外的编码。

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

+2

代替Java StAX'XMLStreamWriter'。 – viktor

+0

谢谢。太棒了。 :) – Saurabh

1

我怀疑问题是,你正在使用一个FileWriter,而不是一个FileOutputStream迷上了一个OutputStreamWriter,其中OSW规定“UTF-8”的编码

0

您可以使用一些更短:

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

此构造可从Java 1.5。

文档说:

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

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