【问题标题】:DOM parsing with UTF-8 XML files使用 UTF-8 XML 文件解析 DOM
【发布时间】:2020-01-20 09:14:50
【问题描述】:

我正在使用 Primefaces <p:fileUpload> 组件供用户选择文件。
其中,我使用fileUploadListener 属性,该属性使用自定义方法读取XML 文件并使用DOMParser 解析它们。我的文件读取和解析代码归结为:

InputStream inputStream = new FileInputStream("C:\\test\\test_ansi.xml");
Reader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputSource is = new InputSource(new BufferedReader(inputStreamReader));
DOMParser parser = new DOMParser();
parser.parse(is);
Document doc = parser.getDocument();

在进一步处理它们之前,我需要将所有用户选择的 XML 转换为 UTF-8。 如果我使用编码为 ANSI 的文件尝试上述代码,则它可以正常工作。但如果文件编码为 UTF-8,我会收到以下错误:

oracle.xml.parser.v2.XMLParseException; lineNumber: 1; columnNumber: 1; Start of root element expected.
    at oracle.xml.parser.v2.XMLError.flushErrors(XMLError.java:233)
    at oracle.xml.parser.v2.XMLError.error(XMLError.java:133)
    at oracle.xml.parser.v2.XMLError.error(XMLError.java:171)
    at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:280)
    at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:241)
    at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:124)

对于示例 UTF-8 文件,我只是将编码为 UTF-8 的文件保存在记事本中。 任何人都可以帮助我了解发生了什么问题吗?

【问题讨论】:

  • 请提供test_ansi.xml文件的内容。
  • @olgacosta 就是这么多:<Vehicles> <vehicle> <name>car</name> <wheels>4</wheels> </vehicle> <vehicle> <name>bike</name> <wheels>2</wheels> </vehicle> </Vehicles>

标签: java xml dom xml-parsing


【解决方案1】:

看起来编码为 UTF-8 的文件在开头包含 Unicode BOM character,这就是解析失败的原因。

您可以像这样使用BOMInputStream 包装 FileInputStream

InputStream inputStream = new FileInputStream("C:\\test\\test_ansi.xml");
BOMInputStream bomInputStream = new BOMInputStream(inputStream, false);
Reader inputStreamReader = new InputStreamReader(bomInputStream, StandardCharsets.UTF_8);

It constructs a new BOM InputStream that detects a ByteOrderMark.UTF_8 and excludes it.

请了解更多详情here

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 2015-11-18
    • 1970-01-01
    • 2012-11-07
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多