【问题标题】:How to get file name in SAX Parser?如何在 SAX 解析器中获取文件名?
【发布时间】:2017-08-29 05:52:37
【问题描述】:

有没有办法在 SAX 解析器处理程序类中获取文件名? 我需要在文本文件中写入文件名和标签内容。

请帮忙。

编辑:我需要这个

saxParser.parse("Input.xml",saxHandler); 在 saxHandler 中,当我得到“id”标签时,读取值并将值与文件名一起存储。它可以是地图或对象。

【问题讨论】:

  • 什么文件?谁说有文件?
  • 我在某个地方读到它不会读取文件。我可以从字符串变量中解析数据,但我对此并不清楚。有没有办法获取文件名?
  • 如果你正在加载文件,你有文件名。如果您只有一个解析器,那么您无能为力。来源可以是任何东西。

标签: java xml sax


【解决方案1】:

SAX 解析器通常会在调用任何其他事件处理方法之前调用ContentHandler.setDocumentLocator()。提供的 Locator 可用于获取 SystemId,如果您从文件中解析,则 SystemId 通常会以 URI 形式为您提供源文件名。

一些注意事项:

  • 鼓励 SAX 解析器调用此方法,但它没有义务这样做。

  • 在某些情况下,例如如果从 FileInputStream 进行解析,则解析器可能不知道源文件名(以及因此 SystemId)(实际上,源 XML 不一定来自文件)。

  • 如果源文档包含多个外部实体,则 SystemId 在解析过程中可能会发生变化。

【讨论】:

    【解决方案2】:

    我来这里是为了寻找答案。我怀疑 Michael Kay 比我知道的更多,但我无法从他的帖子中找出方法,所以我会发布适合我的方法(Python 3)。在我的元素处理程序的 startDocument 方法中,我有以下内容: self.sInFName = 路径(self._locator.getSystemID()).name (这使用 PathLib 的 Path 方法,即在代码顶部附近执行“from pathlib import Path”。)然后我可以从处理程序内的任何位置引用我正在解析的文件的文件名。 (如果您想要文件的完整路径,请省略 .name)

    正如其他人所指出的,这仅在您实际解析文件时才有效。如果您从标准输入或其他内容读取,getSystemID() 将返回文件路径以外的其他内容(我不知道是什么)。

    【讨论】:

      【解决方案3】:

      这在 Java 中对我有用:(感谢 Michael Kay 的指导)

      在文件处理程序中:

      @Override
      public void setDocumentLocator( Locator locator) {
          String systemId = locator.getSystemId();
          Path p = Paths.get(URI.create(systemId));
          String fileName = p.getFileName().toString();
          System.out.println(fileName);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-02
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2011-03-29
        • 1970-01-01
        相关资源
        最近更新 更多