Java изменить и переместить нестандартный XML-файл

Я использую стороннее приложение и хотел бы изменить один из его файлов. Файл хранится в формате XML, но с недопустимым типом документа.

Когда я пытаюсь прочитать, используйте ошибки it, потому что doctype содержит «file: ///ReportWiz.dtd» (как показано, с кавычками), и я получаю исключение для файла not find. Есть ли способ сказать докулдеру игнорировать это? Я попытался установить значение false для false и setNamespaceAware для false для DocumentBuilderFactory.

Единственные решения, которые я могу придумать,

  • копировать файл строка за строкой в ​​новый файл, пропуская строку, вызывающую ошибку, делая то, что мне нужно, затем копируя в другой новый файл и вставляя строку, вызывающую ошибку, или
  • делать в основном то же самое выше, но работать с FileStream некоторого вида (хотя я не понимаю, как я мог бы сделать это .. помощь?)
DocumentBuilderFactory docFactory = DocumentBuilderFactory
                    .newInstance ();
docFactory.setValidating (ложь);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder ();
Документ doc = docBuilder.parse (файл);
10.12.2008 23:57:40
5 ОТВЕТОВ
РЕШЕНИЕ

Скажите вашей DocumentBuilderFactory игнорировать объявление DTD следующим образом:

docFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Смотрите здесь список доступных функций.

Вам также может показаться, что с JDOM работать намного проще, чем с org.w3c.dom:

org.jdom.input.SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
org.jdom.Document doc = builder.build(file);
4
11.12.2008 00:52:06
Именно то, что мне было нужно. СПАСИБО!! Добро пожаловать в ТАК.
Adam Lerman 11.12.2008 00:46:16

Моя первая мысль была связана с этим как поток. Вы можете создать новый адаптер на каком-то уровне и просто скопировать ввод в вывод, за исключением оскорбительного текста.

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

В этом преимущество удивительно громоздкого способа обработки потоков Java - на самом деле вы обладаете большой гибкостью.

1
11.12.2008 00:07:08
Не могли бы вы помочь мне с примером кода (или ссылкой), это очень похоже на то, что я хочу сделать.
Adam Lerman 11.12.2008 00:09:34
Похоже, что вы хотите сделать, это подкласс FilterInputStream и перезаписать read (). Когда вызывается ваше чтение, вызовите super.read (), чтобы получить данные, отсканировать и изменить данные и вернуть их. Я буду дурачиться с этим, если у меня будет время, но это не должно быть слишком сложно.
Bill K 11.12.2008 22:19:48
Вот пример с очень простой фильтрацией (я считаю, что из потока исключаются непечатаемые символы). cafeaulait.org/slides/sd2000west/javaio/44.html Ваш случай сложнее, потому что вам нужно распознать многосимвольный шаблон.
Bill K 11.12.2008 22:21:51

Еще одна вещь, о которой я спорил, - это сохранить весь файл в строке, затем выполнить мои манипуляции и связать строку с файлом. Ничто из этого не кажется чистым или простым, но как лучше всего это сделать?

0
11.12.2008 00:08:00

Обработайте разрешение DTD вручную, либо вернув копию файла DTD (загруженную из пути к классам), либо вернув пустую. Вы можете сделать это, установив распознаватель сущностей в построителе документов:

    EntityResolver er = new EntityResolver() {
        @Override
        public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException {
            if ("file:///ReportWiz.dtd".equals(systemId)) {
                System.out.println(systemId);
                InputStream zeroData = new ByteArrayInputStream(new byte[0]);
                return new InputSource(zeroData);
            }
            return null;
        }
    };
2
11.12.2008 00:29:47
Более сложный, чем мне нужно. Я не пробовал это, но я действительно искал способ полностью игнорировать это.
Adam Lerman 11.12.2008 00:46:54

если вы не хотите предполагать, что синтаксический анализатор является xerces, и хотите общее решение, посмотрите это

0
7.07.2015 17:10:53