【问题标题】:How do you get the xml version of a document using org.jdom2?如何使用 org.jdom2 获取文档的 xml 版本?
【发布时间】:2014-06-30 18:08:00
【问题描述】:

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

【问题讨论】:

    标签: java xml jdom-2


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      我完全相信 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多