1

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

4

2 回答 2

1

XML 版本由 XML 解析器 (SAX) 解析和使用。一些解析器支持 SAX2 API,这允许一些解析器提供扩展的解析信息。如果解析器这样做,则 XML 版本可能在 Locator2 实现 getXMLVersion()中可用。JDOM 没有与此信息挂钩,因此 JDOM 中尚不提供数据。这将是一个很好的功能请求。

JDOM 还以 XML 1.0 版本输出数据。从 JDOM 的角度来看,1.0 和 1.1 之间的差异很小。最显着的区别是不同支持的字符之间的处理略有不同。

如果要为输出指定不同的 XML 版本,可以通过禁用 XMLOutputter 的声明 ( setOmitDeclaration()来强制声明,然后在输出 XML 之前自己将声明转储到流中。

或者,您可以扩展XMLOutputProcessor并覆盖processDelcaraation()方法以输出您想要的声明。

这些选项都不容易,而且 JDOM 中对 XML 1.1 的支持是有限的。您的里程可能会有所不同,但请让我了解您的成功,如果您有建议/问题,请在 Github 问题上提交问题:https ://github.com/hunterhacker/jdom/issues

于 2014-06-30T19:55:33.543 回答
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;
}
于 2014-07-01T18:01:34.280 回答