Ошибка SAX: несовместимые типы: String не может быть преобразован в InputSource

Соответствующий код; barfs при создании экземпляра SAXSource:

TransformerFactory factory = TransformerFactory.newInstance();
XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.ccil.cowan.tagsoup.Parser");
Source input = new SAXSource(xmlReader, "http://books.toscrape.com/");
Result output = new StreamResult(System.out);
factory.newTransformer().transform(input, output);

сказать JavaDoc:

public SAXSource(XMLReader reader,
         InputSource inputSource)

Create a SAXSource, using an XMLReader and a SAX InputSource. The Transformer or SAXTransformerFactory will set itself to be the reader's ContentHandler, and then will call reader.parse(inputSource).

Глядя на InputSource, показывает:

InputSource(InputStream byteStream)
Create a new input source with a byte stream.
InputSource(Reader characterStream)
Create a new input source with a character stream.

Таким образом, для пример это повлечет за собой поток символов для чтения в html для InputStream ??

Будет ли лучше использовать tagsoup для преобразования идентичности это? Но как?

Вы можете использовать URLConnection, у которого есть геттер для InputStream, который представляет ресурс, стоящий за этим URL-адресом.

f1sh 04.01.2019 16:35

это намного практичнее, спасибо.

Thufir 04.01.2019 16:38

я вставил код в ответ.

f1sh 04.01.2019 16:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
237
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете получить доступ к InputStream, который читает из ресурса за URL-адресом следующим образом:

InputStream i = new URL("http://...").openConnection().getInputStream();

Затем вы можете использовать i для вашего SAXSource.

Вы можете это сделать, но если вы не думаете, что вы умнее парней, написавших XML-парсер, с точки зрения управления HTTP-соединениями, тогда проще просто сделать new InputSource("http://....").

Michael Kay 04.01.2019 16:58

Я так не думаю :) Но это способ заставить его работать.

f1sh 04.01.2019 17:00
Ответ принят как подходящий

Существует конструктор https://docs.oracle.com/javase/8/docs/api/org/xml/sax/InputSource.html#InputSource-java.lang.String-, который принимает системный идентификатор, например. URL-адрес, чтобы вы могли использовать Source input = new SAXSource(xmlReader, new InputSource("http://books.toscrape.com/"));.

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