QA@IT
«質問へ戻る

ソースの記述ミス正しました。

0
本文
 ソースでは
 
 ```java
-Document document = documentBuilder.parse(document);
+DocumentBuilder documentBuilder = ...;
+FileInputStream is = ...;
+
+Document document = documentBuilder.parse(is);
 ```
 
 の部分にあたります。

Java の XML 解析で例外が発生する。

Java の org.w3c.dom 関連を使用して外部 XML ファイルをプログラム内の DOM オブジェクトに読み取ろうとしています。
OS は Windows8 (64bit) で JDK のバージョンは 1.7.0_17。
小さな XML ファイルは問題無く読み取ることができるのですが、35MB ほどある大きな XML ファイルを読み取ろうとすると、次のような例外を発生してしまいます。
この例外発生を回避する方法をご存じの方居らっしゃいませんか?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:546)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1708)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2900)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at hogehoge.HOGEHOGE(HOGEHOGE.java:1418)

ソースでは

DocumentBuilder documentBuilder = ...;
FileInputStream is = ...;

Document document = documentBuilder.parse(is);

の部分にあたります。
これは、同一 XML ファイルを MacOS (MountainLion) 上で読み取るときには例外は発生していません。 Linux では試していません。
DocumentBuilder#parse() ではなく、 LSParser#parse() を使用しても同様の例外を発生します。

スタック トレース上の com.sun.org.apache.xerces.internal.impl.io.UTF8Reader のソースを追ってみましたが、どうも com.sun.org.apache.xerces.internal.impl.XMLEntityScanner でファイルの行の文字バッファとして XMLEntityManager で定義されている DEFAULT_BUFFER_SIZE = 8192 というバッファ サイズをオーバーしてアクセスしているようです。
おそらく XML ファイルのある行が 8192 文字を超えてしまっているなどのことで発生しているのかと推測しますが、Windows で発生して MacOS で発生しない理由がよくわかりません。また、DocumentBuilder などのクラスで、このバッファー サイズを増減させる方法もわかっておりません。

MacOS X と Windows の違いというと改行コードか、ということで System.setProperty("line.separator", "\n"); また VM のオプションに -Dline.separator="\n" を行ってみましたが、変化はありませんでした。

以上、よろしくお願いいたします。

Java の org.w3c.dom 関連を使用して外部 XML ファイルをプログラム内の DOM オブジェクトに読み取ろうとしています。
OS は Windows8 (64bit) で JDK のバージョンは 1.7.0_17。
小さな XML ファイルは問題無く読み取ることができるのですが、35MB ほどある大きな XML ファイルを読み取ろうとすると、次のような例外を発生してしまいます。
この例外発生を回避する方法をご存じの方居らっしゃいませんか?

```text
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:546)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1708)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2900)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
	at hogehoge.HOGEHOGE(HOGEHOGE.java:1418)
```

ソースでは

```java
DocumentBuilder documentBuilder = ...;
FileInputStream is = ...;

Document document = documentBuilder.parse(is);
```

の部分にあたります。
これは、同一 XML ファイルを MacOS (MountainLion) 上で読み取るときには例外は発生していません。 Linux では試していません。
`DocumentBuilder#parse()` ではなく、 `LSParser#parse()` を使用しても同様の例外を発生します。

スタック トレース上の `com.sun.org.apache.xerces.internal.impl.io.UTF8Reader` のソースを追ってみましたが、どうも com.sun.org.apache.xerces.internal.impl.XMLEntityScanner でファイルの行の文字バッファとして XMLEntityManager で定義されている DEFAULT_BUFFER_SIZE = 8192 というバッファ サイズをオーバーしてアクセスしているようです。
おそらく XML ファイルのある行が 8192 文字を超えてしまっているなどのことで発生しているのかと推測しますが、Windows で発生して MacOS で発生しない理由がよくわかりません。また、DocumentBuilder などのクラスで、このバッファー サイズを増減させる方法もわかっておりません。

MacOS X と Windows の違いというと改行コードか、ということで `System.setProperty("line.separator", "\n");`  また VM のオプションに -Dline.separator="\n" を行ってみましたが、変化はありませんでした。

以上、よろしくお願いいたします。

質問を投稿

Java の XML 解析で例外が発生する。

Java の org.w3c.dom 関連を使用して外部 XML ファイルをプログラム内の DOM オブジェクトに読み取ろうとしています。
OS は Windows8 (64bit) で JDK のバージョンは 1.7.0_17。
小さな XML ファイルは問題無く読み取ることができるのですが、35MB ほどある大きな XML ファイルを読み取ろうとすると、次のような例外を発生してしまいます。
この例外発生を回避する方法をご存じの方居らっしゃいませんか?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:546)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1708)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2900)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at hogehoge.HOGEHOGE(HOGEHOGE.java:1418)

ソースでは

Document document = documentBuilder.parse(document);

の部分にあたります。
これは、同一 XML ファイルを MacOS (MountainLion) 上で読み取るときには例外は発生していません。 Linux では試していません。
DocumentBuilder#parse() ではなく、 LSParser#parse() を使用しても同様の例外を発生します。

スタック トレース上の com.sun.org.apache.xerces.internal.impl.io.UTF8Reader のソースを追ってみましたが、どうも com.sun.org.apache.xerces.internal.impl.XMLEntityScanner でファイルの行の文字バッファとして XMLEntityManager で定義されている DEFAULT_BUFFER_SIZE = 8192 というバッファ サイズをオーバーしてアクセスしているようです。
おそらく XML ファイルのある行が 8192 文字を超えてしまっているなどのことで発生しているのかと推測しますが、Windows で発生して MacOS で発生しない理由がよくわかりません。また、DocumentBuilder などのクラスで、このバッファー サイズを増減させる方法もわかっておりません。

MacOS X と Windows の違いというと改行コードか、ということで System.setProperty("line.separator", "\n"); また VM のオプションに -Dline.separator="\n" を行ってみましたが、変化はありませんでした。

以上、よろしくお願いいたします。

Java の org.w3c.dom 関連を使用して外部 XML ファイルをプログラム内の DOM オブジェクトに読み取ろうとしています。
OS は Windows8 (64bit) で JDK のバージョンは 1.7.0_17。
小さな XML ファイルは問題無く読み取ることができるのですが、35MB ほどある大きな XML ファイルを読み取ろうとすると、次のような例外を発生してしまいます。
この例外発生を回避する方法をご存じの方居らっしゃいませんか?

```text
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:546)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1708)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2900)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
	at hogehoge.HOGEHOGE(HOGEHOGE.java:1418)
```

ソースでは

```java
Document document = documentBuilder.parse(document);
```

の部分にあたります。
これは、同一 XML ファイルを MacOS (MountainLion) 上で読み取るときには例外は発生していません。 Linux では試していません。
`DocumentBuilder#parse()` ではなく、 `LSParser#parse()` を使用しても同様の例外を発生します。

スタック トレース上の `com.sun.org.apache.xerces.internal.impl.io.UTF8Reader` のソースを追ってみましたが、どうも com.sun.org.apache.xerces.internal.impl.XMLEntityScanner でファイルの行の文字バッファとして XMLEntityManager で定義されている DEFAULT_BUFFER_SIZE = 8192 というバッファ サイズをオーバーしてアクセスしているようです。
おそらく XML ファイルのある行が 8192 文字を超えてしまっているなどのことで発生しているのかと推測しますが、Windows で発生して MacOS で発生しない理由がよくわかりません。また、DocumentBuilder などのクラスで、このバッファー サイズを増減させる方法もわかっておりません。

MacOS X と Windows の違いというと改行コードか、ということで `System.setProperty("line.separator", "\n");`  また VM のオプションに -Dline.separator="\n" を行ってみましたが、変化はありませんでした。

以上、よろしくお願いいたします。