Java Синтаксический анализатор SAX повышает UnknownHostException

Первая проблема может быть вызвана, если по умолчанию модель инициализирует свой текущий индекс в текущем каталоге. Это будет означать, что если вы снова установите с тем же индексом, сигнал изменения строки не будет излучаться (потому что ничего не изменилось). Это можно исправить, вызвав непосредственно обработчик изменения строки:

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        ...
        focus_path = QDir.currentPath()
        focus_index = self.my_model.index(focus_path)
        self.my_view.setCurrentIndex(focus_index)
        self.current_row_changed()

    def current_row_changed(self):
        index = self.my_view.currentIndex()
        self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
        self.my_view.resizeColumnToContents(0)
        ...

Что касается второй проблемы: при вызове scrollTo может потребоваться развернуть несколько каталогов, чтобы выбрать требуемый индекс. Очевидно, это может изменить ширину первого столбца, поэтому вы всегда должны вызывать resizeColumnToContents после , чтобы получить правильную ширину.

ОБНОВЛЕНИЕ :

Я думаю, что есть и другая проблема, вызванная проблемами синхронизации. QFileSystemModel должен работать в некоторой степени асинхронно, потому что он должен запрашивать ресурсы у операционной системы, а затем ждать ответа. Кроме того, прежде чем он получит ответ, он не может заранее точно знать, сколько данных он собирается получить, поскольку файловая система, возможно, была обновлена ​​во время ожидания. Потенциально, ответ может включать данные из огромного каталога, содержащего тысячи файлов. Таким образом, чтобы обеспечить отзывчивость графического интерфейса, данные обрабатываются партиями, которые имеют достаточный размер для заполнения текущего представления. Если текущий индекс установлен до того, как окно было показано, и все его виджеты полностью разложены , нет гарантии, что представление сможет корректно изменять размеры своих столбцов.

Это может быть исправлено путем явного повторного вызова обработчика изменения строки через однократный таймер с небольшой задержкой. Это должно позволить представлению правильно пересчитать ширину столбцов:

    ...    
    focus_path = QDir.currentPath()
    focus_index = self.my_model.index(focus_path)
    self.my_view.setCurrentIndex(focus_index)
    QTimer.singleShot(50, self.current_row_changed)

def current_row_changed(self):
    index = self.my_view.currentIndex()
    self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
    self.my_view.resizeColumnToContents(0)
7
задан Eric Nicolas 17 November 2008 в 15:00
поделиться

3 ответа

Хорошо, складывается parse() метод переопределяет любой ранее сопоставители объекта набора с обработчиком, переданным в к методу синтаксического анализа. Следующий код должен работать:

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(false);
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.parse(new java.io.File("x.xml"), new org.xml.sax.helpers.DefaultHandler(){
        public org.xml.sax.InputSource resolveEntity(String publicId, String systemId)
                throws org.xml.sax.SAXException, java.io.IOException {
            System.out.println("Ignoring: " + publicId + ", " + systemId);
            return new org.xml.sax.InputSource(new java.io.StringReader(""));
        }
    }); 
10
ответ дан 6 December 2019 в 23:15
поделиться

Необходимо обеспечить EntityResolve, чтобы иметь проблемную твердость. Я рекомендую Вам записать сопоставитель, который будет знать, как считать ДАТЫ локально вместо этого (при условии, что Вам поставили их вместе с Вашим приложением). Иначе возвратите пустой указатель как предложенный Gowri.

Вы могли бы хотеть прочитать документ API.

yc

0
ответ дан 6 December 2019 в 23:15
поделиться

Можно реализовать пользовательское EntityResolver который является тем, что привыкло к поиску внешние объекты во время парсинга XML.

org.xml.sax.EntityResolver customEntityResolver = new DummyEntityResolver();
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.getXMLReader().setEntityResolver(customEntityResolver);
parser.parse(xmlFile, handler);

И в Вашем пользовательском EntityResolver, просто всегда возвращайте пустой указатель. Я думаю, что это должно решить эту проблему.

0
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: