8

StAXを使用してXMLファイルを作成し、XSDを使用してファイルを検証しています。

XMLファイルの作成中にエラーが発生します:

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)

コードスニペットは次のとおりです。

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で実行しています。バージョンとエンコードスタイルを設定する方法を知っている人はいますか?

4

4 に答える 4

14

createXMLStreamWriter()出力パラメータでも使用しようと思います。

[編集] 試してみましたが、createXMLStreamWriter 行を変更することで機能します。

XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileOutputStream(fileName), "UTF-8");

[編集 2] 記録のために、もう少し複雑なテストを行いました。

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();
    }
  }
}
于 2010-05-31T14:11:40.290 に答える
6

これは機能するはずです:

// ...
Writer writer = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8");
XMLStreamWriter xtw = xof.createXMLStreamWriter(writer);
xtw.writeStartDocument("UTF-8", "1.0");
// ...
于 2010-06-01T19:46:16.597 に答える
2

コードから確実に知ることは困難ですが、JDK 1.6 が提供するデフォルトの Stax 実装 (Sun sjsxp) に依存している場合は、アップグレードしてWoodstoxを使用することをお勧めします。Sjsxp よりもバグが少ないことが知られており、Stax2 API 全体をサポートし、積極的に開発およびサポートされています (一方、Sun バージョンは作成されたばかりで、バグ修正の数は限られています)。

しかし、あなたのコードのバグはこれです:

XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileWriter(fileName));

デフォルトのプラットフォーム エンコーディングに依存しています (これは CP-1252 である必要がありますか?)。使用しているエンコーディングを常に明示的に指定する必要があります。ストリームライターは、危険なことをしていないことを確認しているだけで、ドキュメントの破損を引き起こす可能性のある矛盾を発見しました。これは、実際にはこれがデフォルトの Stax プロセッサーではないことを示唆しています。:-)

(他の回答も正しい回避策を示しています。OutputStream とエンコーディングを渡すだけで、XMLStreamWriter が正しいことを実行できるようになります)

于 2011-01-13T19:10:31.227 に答える