0

HTML テーブルのコンテンツを解析して CSV に書き込もうとしています。StaX パーサーを試しています。html には&nbps'、およびのようなエスケープ文字が含まれています。&

私はorg.apache.commons.lang3.StringEscapeUtils、html を 1 行ずつ usescape し、新しいファイルに書き込むために使用しています。

StAX は、エスケープされていない文字をまだ解析できません。

この例外の修正または処理を手伝ってください。

以下のxmlフラグメントでテストします- <root><element>A &nbsp; B &nbsp; </element></root>

以下のコードを呼び出して、html をアンエスケープします -

   StringEscapeUtils.unescapeHtml4(escapedHtml)

そしてそれをファイルに書き込みます。

次に、Stax Parser を使用してそのファイルを解析しようとします -

public void unescapeHtmlFile(String filePath) throws IOException{
    BufferedReader fileReader = null;
    BufferedWriter fileWriter = null;
    try{
    fileReader = new BufferedReader(new FileReader(filePath));
    fileWriter = new BufferedWriter(new FileWriter("./out/UnescapedHtml.html"));

    String line = null;
    String unescapedLine = null;
    while((line=fileReader.readLine())!=null){
        System.out.println("Before: " + line);
        unescapedLine = StringEscapeUtils.unescapeHtml4(line);
        System.out.println("After: " + unescapedLine);
        fileWriter.newLine();
        fileWriter.write(unescapedLine);
    }
    }finally{
        fileReader.close();
        fileWriter.close();
    }
}

そして、出力は以下のとおりです-

Document started 
<?xml version="null" encoding='UTF-8' standalone='no'?>
Element started
<root>
Element started
<element0>
Characters
0123456   7890   ABC   DEF
Element ended
</element0>
Element started
<element1>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,66]
Message: Invalid byte 1 of 1-byte UTF-8 sequence.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:596)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83)
    at parser.StreamParserTest.main(StreamParserTest.java:30)
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,66]
Message: XML document structures must start and end within the same entity.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83)
    at parser.StreamParserTest.main(StreamParserTest.java:30)

&nbsp; Please helpのエスケープされていない値を解析できません。

4

1 に答える 1

1

クラス FileReader と FileWriter は古いユーティリティ クラスであり、残念ながら現在のプラットフォーム エンコーディングを使用しています。Windows では、ほぼ確実に UTF-8 ではありません。また、XML は一般に UTF-8 です (これは実際にすべての文字を表すことができます。

fileReader = new BufferedReader(new FileReader(filePath));
fileWriter = new BufferedWriter(new FileWriter("./out/UnescapedHtml.html"));

する必要があります

fileReader = new BufferedReader(new InputStreamReader(
        new FileInputStream(filePath), StandardCharsets.UTF_8));
fileWriter = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("./out/UnescapedHtml.html"),
        StandardCharsets.UTF_8));

正直なところ、文字セットの属性<?xml ...?>があるかどうかを読んで確認する必要がありencodingます。デフォルトは UTF-8 です。StandardCharsets.ISO_8859_1UTF-8 は間違ったマルチバイト シーケンスにつまずくため、これは で行うことができます。

Strings の代わりに StandardCharsets を使用する "UTF-8" は、

  1. 処理する UnsupportedEncodingException
  2. 魔法定数。

StandardCharsets はサポートされることが保証されています。

于 2014-02-04T12:22:27.310 に答える