Разобрать любой тип файла как 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.