0

我正在尝试解析 HTML 表格的内容并将其写入 CSV。我正在尝试 StaX 解析器 html 包含转义字符,例如&nbps'&

我正在使用org.apache.commons.lang3.StringEscapeUtils逐行使用 html 并写入新文件。

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_1,因为 UTF-8 会因错误的多字节序列而绊倒。

使用 StandardCharsets 而不是字符串“UTF-8”消除了

  1. 要处理的 UnsupportedEncodingException,
  2. 一个神奇的常数。

保证支持 StandardCharsets。

于 2014-02-04T12:22:27.310 回答