首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StAX -使用XMLStreamWriter设置版本和编码

StAX -使用XMLStreamWriter设置版本和编码
EN

Stack Overflow用户
提问于 2010-05-31 20:45:52
回答 4查看 24K关注 0票数 8

我使用StAX创建XML文件,然后用和XSD验证文件。

创建XML文件时出现错误:

代码语言:javascript
复制
javax.xml.stream.XMLStreamException: Underlying stream encoding 'Cp1252' and input paramter for writeStartDocument() method 'UTF-8' do not match.
        at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeStartDocument(XMLStreamWriterImpl.java:1182)

以下是代码片段:

代码语言:javascript
复制
XMLOutputFactory xof =  XMLOutputFactory.newInstance();

try{

  XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileWriter(fileName));
  xtw.writeStartDocument("UTF-8","1.0");} catch(XMLStreamException e) {
  e.printStackTrace();

} catch(IOException ie) {

  ie.printStackTrace();

}

我在Unix上运行这段代码。有人知道如何设置版本和编码风格吗?

EN

回答 4

Stack Overflow用户

发布于 2010-05-31 22:11:40

我也会尝试使用带有输出参数的createXMLStreamWriter()

编辑尝试,它的工作方式是更改createXMLStreamWriter行:

代码语言:javascript
复制
XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileOutputStream(fileName), "UTF-8");

编辑2做了一个更复杂的测试,为了记录:

代码语言:javascript
复制
String fileName = "Test.xml";
XMLOutputFactory xof =  XMLOutputFactory.newInstance();
XMLStreamWriter xtw = null;
try
{
  xtw = xof.createXMLStreamWriter(new FileOutputStream(fileName), "UTF-8");
  xtw.writeStartDocument("UTF-8", "1.0");
  xtw.writeStartElement("root");
  xtw.writeComment("This is an attempt to create an XML file with StAX");

  xtw.writeStartElement("foo");
  xtw.writeAttribute("order", "1");
    xtw.writeStartElement("meuh");
    xtw.writeAttribute("active", "true");
      xtw.writeCharacters("The cows are flying high this Spring");
    xtw.writeEndElement();
  xtw.writeEndElement();

  xtw.writeStartElement("bar");
  xtw.writeAttribute("order", "2");
    xtw.writeStartElement("tcho");
    xtw.writeAttribute("kola", "K");
      xtw.writeCharacters("Content of tcho tag");
    xtw.writeEndElement();
  xtw.writeEndElement();

  xtw.writeEndElement();
  xtw.writeEndDocument();
}
catch (XMLStreamException e)
{
  e.printStackTrace();
}
catch (IOException ie)
{
  ie.printStackTrace();
}
finally
{
  if (xtw != null)
  {
    try
    {
      xtw.close();
    }
    catch (XMLStreamException e)
    {
      e.printStackTrace();
    }
  }
}
票数 14
EN

Stack Overflow用户

发布于 2010-06-02 03:46:17

这应该是可行的:

代码语言:javascript
复制
// ...
Writer writer = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8");
XMLStreamWriter xtw = xof.createXMLStreamWriter(writer);
xtw.writeStartDocument("UTF-8", "1.0");
// ...
票数 6
EN

Stack Overflow用户

发布于 2011-01-14 03:10:31

从代码中很难确定,但如果您依赖于JDK1.6提供的默认Stax实现( sjsxp),我建议您升级到使用Woodstox。众所周知,它没有Sjsxp那么容易出错,支持整个Sun,并且已经得到了积极的开发和支持(而Stax2版本是刚刚编写的,修复的错误数量有限)。

但是代码中的bug是这样的:

代码语言:javascript
复制
XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileWriter(fileName));

您使用的是默认平台编码(必须是CP-1252,windows?)。您应该始终显式指定您正在使用的编码。Stream writer只是验证您是否正在做一些危险的事情,并发现可能导致文档损坏的不一致。相当聪明,这实际上表明这不是默认的Stax处理器。:-)

(其他答案也指出了一个正确的解决方法,只需传递OutputStream和编码,让XMLStreamWriter做正确的事情)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2943605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档