如何使用org.jdom2获取文档的xml版本?

时间:2014-06-30 18:08:00

标签: java xml jdom-2

我正在使用org.jdom2来解析xml文件。我需要知道文件是标记为版本1.1还是版本1.0。我如何访问xml声明? 另外,如何使用XMLOutputter写入输出时设置版本?

2 个答案:

答案 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;
}