Разобрать любой тип файла как XML

У меня есть следующий фрагмент кода в скрипте Gradle (синтаксис представляет собой комбинацию Groovy/Java):

File file = new File(filename) // Filename is being read from console
def content = file.getText()
Document document = DOMBuilder.parse(new StringReader(content), false, false)

Проблема в том, что я пытаюсь разобрать файл XML, но с xconf расширение (например, file.xconf). По той или иной причине, когда я пытаюсь выполнить приведенный выше код, я получаю следующее сообщение об ошибке (в консоли):

java.io.FileNotFoundException: <full_path>/file.dtd (No such file or directory)

Путь правильный, но я заметил, что расширение внезапно меняется на .dtd, Я заметил, что в файле есть ссылка на .dtd версия этого файла, но я хочу, чтобы синтаксический анализатор игнорировал это (и прекращал валидацию, поэтому второй аргумент DOMBuilder.parse() ложно). Могу ли я изменить это поведение, чтобы иметь возможность успешно проанализировать файл?

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

Заранее спасибо!

3 ответа

Решение

Попробуй это:

import groovy.xml.*
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

Document parseWithoutDTD( Reader r, boolean validating=false, boolean namespaceAware=true ) {
  FactorySupport.createDocumentBuilderFactory().with { f ->
    f.namespaceAware = namespaceAware
    f.validating = validating
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    f.newDocumentBuilder().with { db ->
      db.parse( new InputSource( r ) )
    }
  }
}

Document d = new File( filename ).withReader { r ->
  parseWithoutDTD( r )
}

Файл.xconf xml должен иметь определенную ссылку DTD в XML. Откройте файл и проверьте.

Парсер DOM по умолчанию проверяет XML на соответствие DTD, связанному с XML. Если вы не хотите проверять, установите режим проверки на false. Проверьте DomBuilder API.

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

DTD определяет правила для документов XML. Если вы следуете этим правилам, документ xml считается " действительным". Если вы хотите игнорировать файл DTD (например, потому что он не существует), установите режим проверки вашего анализа на false.

Другие вопросы по тегам