Как получить имя файла в SAX Parser?

Есть ли способ получить имя файла в классе обработчика парсера SAX? У меня есть требование написать имя файла вместе с содержимым тега в текстовом файле.

Пожалуйста помоги.

РЕДАКТИРОВАТЬ: мне нужно это

saxParser.parse("Input.xml", saxHandler); в saxHandler, когда я получил тег «id», прочитайте значение и сохраните значение вместе с именем файла. Это может быть карта или объект.


person Techie    schedule 29.08.2017    source источник
comment
Какой файл? Кто сказал, что есть файл?   -  person shmosel    schedule 29.08.2017
comment
Я где-то читал, что он не будет читать файл. Я мог бы анализировать данные из строковой переменной, но у меня нет четкого представления об этом. Нет ли способа получить имя файла?   -  person Techie    schedule 29.08.2017
comment
Если вы загружаете файл, у вас есть имя файла. Если все, что у вас есть, это синтаксический анализатор, вы мало что можете сделать. Источник может быть любым.   -  person shmosel    schedule 29.08.2017


Ответы (3)


Синтаксический анализатор SAX обычно вызывает ContentHandler.setDocumentLocator() перед вызовом любых других методов обработки событий. Предоставленный локатор можно использовать для получения SystemId, и если вы анализируете файл, то SystemId обычно дает вам имя исходного файла в форме URI.

Некоторые предостережения:

  • Парсеру SAX рекомендуется вызывать этот метод, но он не обязан это делать.

  • В некоторых случаях, например. при синтаксическом анализе из FileInputStream имя исходного файла (и, следовательно, SystemId) может быть неизвестно синтаксическому анализатору (действительно, исходный XML не обязательно исходит из файла).

  • Если исходный документ содержит несколько внешних сущностей, то SystemId может измениться в ходе синтаксического анализа.

person Michael Kay    schedule 29.08.2017

Я пришел сюда в поисках ответа. Я подозреваю, что Майкл Кей знает об этом намного больше, чем я, но я не смог понять метод из его поста, поэтому я опубликую то, что работает для меня (Python 3). В моем методе startDocument обработчика элементов у меня есть следующее: self.sInFName = Path(self._locator.getSystemID()).name (здесь используется метод Path библиотеки PathLib, т. code.) Затем я могу обратиться к имени файла, который я анализирую, из любого места внутри обработчика. (Если вам нужен полный путь к файлу, опустите .name)

Как указывали другие, это работает, только если вы действительно анализируете файл. Если вы читаете со стандартного ввода или чего-то еще, getSystemID() вернет что-то отличное от пути к файлу (я не знаю что).

person Mike Maxwell    schedule 25.06.2019

Это сработало для меня на Java: (Спасибо Майклу Кею за направление)

В обработчике файлов:

@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);
}
person Data Command    schedule 26.09.2019