【发布时间】:2014-06-30 18:08:00
【问题描述】:
我正在使用 org.jdom2 来解析 xml 文件。我需要知道该文件是标记为 1.1 版还是 1.0 版。如何访问 xml 声明? 另外,使用 XMLOutputter 编写输出时如何设置版本?
【问题讨论】:
我正在使用 org.jdom2 来解析 xml 文件。我需要知道该文件是标记为 1.1 版还是 1.0 版。如何访问 xml 声明? 另外,使用 XMLOutputter 编写输出时如何设置版本?
【问题讨论】:
XML 版本由 XML 解析器 (SAX) 解析和使用。一些解析器支持 SAX2 API,这允许一些解析器提供扩展的解析信息。如果解析器这样做,则 XML 版本可能可用in the Locator2 implementation getXMLVersion()。 JDOM 没有与此信息挂钩,因此 JDOM 中尚不提供数据。这将是一个很好的功能请求。
JDOM 也以 XML 1.0 版本输出数据。从 JDOM 的角度来看,1.0 和 1.1 之间的差异很小。最显着的区别是不同支持的字符之间的处理略有不同。
如果您想为输出指定不同的 XML 版本,您可以通过禁用 XMLOutputter 的声明 (setOmitDeclaration()) 来强制声明,然后在输出 XML 之前自行将声明转储到流中。
或者,您可以扩展 XMLOutputProcessor 并覆盖 processDelcaration() 方法以输出您想要的声明。
这些选项都不容易,JDOM 中对 XML 1.1 的支持是有限的。您的里程可能会有所不同,但请让我了解您的成功,如果您有建议/问题,请在 Github 问题上提交问题:https://github.com/hunterhacker/jdom/issues
【讨论】:
我完全相信 rolfl 的回答是正确的。这不是我最终采取的方法。我决定自己快速解析文档。这可能需要对带有 BOM 的文档进行进一步测试。
private static Pattern xmlDeclaration = Pattern.compile("<?xml.* version=\"([\\d|\\.]+)\".*?>");
private static boolean isXml10(InputStream inputStream) throws IOException
{
boolean result = true;
InputStreamReader is = null;
BufferedReader br = null;
try
{
is = new InputStreamReader(inputStream);
br = new BufferedReader(is);
String line = br.readLine();
Matcher declarationMatch = xmlDeclaration.matcher(line);
if (declarationMatch.find())
{
String version = declarationMatch.group(1);
result = version.equals("1.0");
}
}
finally
{
is.close();
br.close();
}
return result;
}
【讨论】: