我正在使用org.jdom2来解析xml文件。我需要知道文件是标记为版本1.1还是版本1.0。我如何访问xml声明? 另外,如何使用XMLOutputter写入输出时设置版本?
答案 0 :(得分:0)
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
答案 1 :(得分:0)
我完全相信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;
}