以前のリンク://java/how-to-read-xml-file-in-java-sax-parser/[Java SAX XMLの例]では、SAXを使用してプレーンテキスト(ANSI)XMLを解析すると問題はありませんただし、特殊なUTF-8文字を含むXMLファイルを解析すると、「

1バイトのUTF-8シーケンスの無効なバイト1

“例外。

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:
Invalid byte 1 of 1-byte UTF-8 sequence.

特殊なUTF-8文字「§」を含む次のxmlファイルを参照してください(http://tools.oratory.com/altcodes.html[Alt 789]を押してください)。

<?xml version="1.0"?>
<company>
    <staff>
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>§</nickname>
        <salary>100000</salary>
    </staff>
</company>

これを修正するには、SAX入力ソースを次のようにオーバーライドします。

File file = new File("c:\\file-utf.xml");
InputStream inputStream= new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");

saxParser.parse(is, handler);

Unicode XMLファイルを解析するためのSAXパーサーの使用例の完全な例を参照してください。

package com.mkyong.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLUTF8FileSAX
{
    public static void main( String[]args )
    {
        try {

              SAXParserFactory factory = SAXParserFactory.newInstance();
              SAXParser saxParser = factory.newSAXParser();

              DefaultHandler handler = new DefaultHandler() {

                boolean bfname = false;
                boolean blname = false;
                boolean bnname = false;
                boolean bsalary = false;

                public void startElement(String uri, String localName,
                    String qName, Attributes attributes)
                    throws SAXException {

                  System.out.println("Start Element :" + qName);

                  if (qName.equalsIgnoreCase("FIRSTNAME")) {
                      bfname = true;
                  }

                  if (qName.equalsIgnoreCase("LASTNAME")) {
                      blname = true;
                  }

                  if (qName.equalsIgnoreCase("NICKNAME")) {
                      bnname = true;
                  }

                  if (qName.equalsIgnoreCase("SALARY")) {
                      bsalary = true;
                  }

                }

                public void endElement(String uri, String localName,
                        String qName)
                        throws SAXException {

                      System.out.println("End Element :" + qName);

                }

                public void characters(char ch[], int start, int length)
                    throws SAXException {

                  System.out.println(new String(ch, start, length));


                  if (bfname) {
                    System.out.println("First Name : "
                        + new String(ch, start, length));
                    bfname = false;
                  }

                  if (blname) {
                      System.out.println("Last Name : "
                          + new String(ch, start, length));
                      blname = false;
                   }

                  if (bnname) {
                      System.out.println("Nick Name : "
                          + new String(ch, start, length));
                      bnname = false;
                   }

                  if (bsalary) {
                      System.out.println("Salary : "
                          + new String(ch, start, length));
                      bsalary = false;
                   }

                }

              };

              File file = new File("c:\\file.xml");
              InputStream inputStream= new FileInputStream(file);
              Reader reader = new InputStreamReader(inputStream,"UTF-8");

              InputSource is = new InputSource(reader);
              is.setEncoding("UTF-8");

              saxParser.parse(is, handler);


            } catch (Exception e) {
              e.printStackTrace();
            }

    }
}

リンク://タグ/java/[java]

sax


xml