gpt4 book ai didi

java - 无法使用 StAX 解析由 Apache Commons StringEscapeUtils.unescapeHtml 生成的字符

转载 作者:行者123 更新时间:2023-12-01 13:31:16 26 4
gpt4 key购买 nike

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

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

StAX 仍然无法解析未转义的字符。

请帮助我修复或处理此异常。

我用下面的 xml 片段进行测试 - ojit_代码

我调用下面的代码来转义 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)

无法解析 <root><element>A &nbsp; B &nbsp; </element></root> 的未转义值请帮忙。

最佳答案

类 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。

关于java - 无法使用 StAX 解析由 Apache Commons StringEscapeUtils.unescapeHtml 生成的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com