我正在尝试解析HTML表的内容并将其写入CSV。
我正在尝试StaX解析器
html包含转义字符,例如&nbps'
和&
我正在使用org.apache.commons.lang3.StringEscapeUtils
逐行使用html并写入新文件。
StAX仍无法解析未转义的字符。
请帮助我解决或处理此异常。
我用下面的xml片段进行测试-<root><element>A B </element></root>
我在下面的代码中调用unescape 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)
无法解析
的未转义值请帮忙。
最佳答案
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”可以消除
一个UnsupportedEncodingException来处理,
一个魔术常数。
保证支持StandardCharsets。
关于java - 无法使用StAX解析由Apache Commons StringEscapeUtils.unescapeHtml生成的字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21552315/