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

在通过java编写xml时处理特殊字符,java,special-characters,Java,Special Characters,通过一个java程序,我创建了一个股东的xml。生成的xml看起来像- <?xml version="1.0" encoding="UTF-8" ?> <urlset> <url> <loc>FirstName-LastName/id/</loc> </url> </urlset> FirstName LastName/id/ 有些股东的名字中有特殊字符,例如A.Pitkänen。现在,当我看到这个股票持

通过一个java程序,我创建了一个股东的xml。生成的xml看起来像-

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

FirstName LastName/id/
有些股东的名字中有特殊字符,例如A.Pitkänen。现在,当我看到这个股票持有者的xml时-

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

/A-Pitk寥n/ELS_1005091/
这使得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();
    }
FileWriter fstream=newfilewriter(“c:\stockholders.xml”);
最终BufferedWriter out=新的BufferedWriter(fstream);
试一试{
//建立连接并查询股票持有人以获取结果集
字符串aId=“”;
字符串aFName=“”;
字符串aLName=“”;
输出。写入(“\n”);
输出。写入(“\n”);
while(rs.next()){
字符串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+“/”;
}
输出。写入(“\n”);
out.write(“+url+”\n”);
输出。写入(“\n”);
out.flush();
}
请写出(“”);
out.close();
}

我怀疑问题在于您使用的是文件写入程序,而不是连接到a OutputStreamWriter的文件输出流,其中OSW指定“utf-8”作为编码

我怀疑问题在于您使用的是文件写入程序,而不是连接到a OutputStreamWriter的文件输出流,其中OSW指定“utf-8”由于编码是以utf-8编码编写XML文件,因此需要配置
编写器以使用该编码,而不是系统默认编码:

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

因为您的XML文件应该是用UTF-8编码编写的,所以您需要配置
编写器来使用该编码,而不是系统定义第一:

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

您可以使用更简短的方法:

PrintWriter out = new PrintWriter("c:\\stock-holders.xml", "UTF-8");
此构造函数自Java 1.5起就可用

文件说:

使用 指定的文件名和字符集。此方便构造函数创建 必要的中间
OutputStreamWriter
,它将编码 使用提供的字符集的字符


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

您可以使用更简短的方法:

PrintWriter out = new PrintWriter("c:\\stock-holders.xml", "UTF-8");
此构造函数自Java 1.5起就可用

文件说:

使用 指定的文件名和字符集。此方便构造函数创建 必要的中间
OutputStreamWriter
,它将编码 使用提供的字符集的字符


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

Java-StAX
XMLStreamWriter
,而不是Java-StAX
XMLStreamWriter