Java 如何在SAX解析器中获取文件名?

Java 如何在SAX解析器中获取文件名?,java,xml,sax,Java,Xml,Sax,有没有办法在SAX解析器处理程序类中获取文件名?。 我需要在文本文件中写入文件名和标记内容 请帮忙 编辑:我需要这个 parse(“Input.xml”,saxHandler); 在saxHandler中,当我获得'id'标记时,读取该值并将该值与文件名一起存储。它可以是映射或对象。SAX解析器通常会在调用任何其他事件处理方法之前调用ContentHandler.setDocumentLocator()。提供的定位器可用于获取SystemId,如果您是从文件进行解析,则SystemId通常会以U

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

请帮忙

编辑:我需要这个

parse(“Input.xml”,saxHandler);
在saxHandler中,当我获得'id'标记时,读取该值并将该值与文件名一起存储。它可以是映射或对象。

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

一些警告:

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

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

  • 如果源文档包含多个外部实体,则SystemId可以在解析过程中更改


    • 我来这里寻找答案。我怀疑Michael Kay对此的了解要比我多,但我无法从他的帖子中找到一个方法,所以我将发布适合我的方法(Python 3)。在我的元素处理程序的startDocument方法中,我有以下内容: self.sInFName=Path(self.\u locator.getSystemID()).name (这使用PathLib的Path方法,即在代码顶部附近执行'from PathLib import Path')。然后,我可以从处理程序中的任何位置引用正在解析的文件的文件名。(如果需要文件的完整路径,请省略.name)


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

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

      在fileHandler中:

      @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);
      }
      

      什么文件?谁说有一个文件?我在某个地方读过,它不会读文件。我可以解析字符串变量中的数据,但对此我没有明确的概念。无法获取文件名吗?如果正在加载文件,则具有文件名。如果您只有一个解析器,那么就没有什么可以做的了。来源可以是任何东西。