Java, xml, XSLT: Предотвратите Проверку DTD

Jon прав в высказывании, что “ [d] ifferent задачи удовлетворяют различным языкам и парадигмам. ” Однако существуют несколько соображений, которые в основном независимы от домена. Они главным образом касаются синтаксиса, но так как код читается чаще, чем записанный, я на самом деле думаю тот синтаксис вопросы.

, С одной стороны, и что-то, что много языков делают неправильно, абсолютно не имеет смысла основывать синтаксис от C. C на самом деле имеет исключительно неверный синтаксис. Я просто выберу два примера.

первое является довольно бесспорным: точки с запятой являются ненужными. Возьмите следующий код; грамматика абсолютно однозначна и легка проанализировать для компилятора. Ни точки с запятой, ни явные продолжения строки не необходимы.

answer = 42
fraction = answer * 2 /
           (answer + 1)
Console.WriteLine(
    "Some funny number: {0}",
    fraction
)

Это является на самом деле весьма схожим с Python, но еще более разрешающим: определение fraction промежутки несколько строк. Это логично, так как первая строка еще не завершена.

Другая кость, которую я должен выбрать с подобным синтаксису C, является их в основном неявными объявлениями переменной. Вместо того, чтобы объявить ясно о “I'm, объявляющем variable из типа Foo, ” все, они шепчут, застенчиво “ Foo var ”. С тех пор Foo даже не зарезервированное слово в большинстве случаев, программисту не предлагают единственную визуальную подсказку здесь. Я предпочитаю VB's, явный Dim var As Foo, даже думал он, ключевое слово, используемое здесь, ну, в общем, довольно тускло.

(C++ на самом деле делает вопросы очень, намного хуже путем представления большого количества почти идентичных и часто неоднозначных синтаксисов, которые означают совершенно другие вещи от переменных инициализаций до объявлений функции).

Другая вещь мой , который должен был бы иметь язык, является статическим контролем типов. Это верно, что динамический контроль типов имеет его использование, но они удивительно редки. Даже большей части “scripting languages” действительно не были бы нужны они. Я думаю, что это часто путается с [1 113] неявный ввод, который имеет скорее больше использования. Возьмите (снова) пример Python. Почему это не предлагает статический контроль типов? Это уже - статическая проверка типа со строгим контролем типов, только было бы последовательно, и сократит отладку вполне немного. То же идет для явного объявления переменной. Мне не удается видеть то, что способствует подразумеваемым предложениям объявления переменной.

, Таким образом, там мы уже получили схему для языка:

  • Чистый синтаксис, избегайте исторической помехи. В особенности:
    • Никакие точки с запятой
    • Никакие явные продолжения строки Г la VB
  • Явные объявления переменной
  • Статический контроль типов

, Кроме того, я - огромный поклонник определенных понятий C++, таких как шаблоны общего назначения, RAII (т.е. мусор предотвращения вместо того, чтобы собрать его), неизменность и понятие диапазонов значений определил через итераторы. Я заявил в другом месте, что полагаю, что итераторы одна из самых фундаментальных инноваций когда-либо. Give'em немного помады и Вы даже не распознаете ужасного зверя, который является C++:

for i in MyVector:
    print(i)

, а не

for (typename vector::const_iterator i = MyVector.begin();
     i != MyVector.end();
     ++i)
    cout << *i << endl;

, Конечно, я знаю, что вышеупомянутый синтаксис предлагается многими языками. Но они все единственное предложение вниз политые версии C++' мощное понятие итератора (для использования терминологии C++ единственный вид итераторов, которые знает большинство языков, является входными итераторами, которые являются в основном наименее мощными итераторами).

В этой точке я должен, вероятно, сказать, что единственное авторское право на все эти идеи является моим, ожидание патентов (в особенности для MayOrMayNotBe оператор , который действительно не сравнивает ссылки на объект).

5
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Недавно у меня возникла эта проблема при демаршалинге XML с помощью JAXB. Ответ заключался в том, чтобы создать SAXSource из XmlReader и InputSource, а затем передать его методу unmarshal () JAXB UnMarshaller. Чтобы избежать загрузки внешнего DTD, я установил пользовательский EntityResolver для XmlReader.

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xmlr = sp.getXMLReader();
xmlr.setEntityResolver(new EntityResolver() {
    public InputSource resolveEntity(String pid, String sid) throws SAXException {
        if (sid.equals("your remote dtd url here"))
            return new InputSource(new StringReader("actual contents of remote dtd"));
        throw new SAXException("unable to resolve remote entity, sid = " + sid);
    } } );
SAXSource ss = new SAXSource(xmlr, myInputSource);

Как написано, этот настраиваемый преобразователь сущностей выдаст исключение, если его когда-либо попросят разрешить объект, ДРУГОЙ, чем тот, который вы хотите разрешить. Если вы просто хотите, чтобы он продолжал загружать удаленный объект, удалите строку «throws».

5
ответ дан 14 December 2019 в 01:11
поделиться

Вам необходимо использовать javax.xml.parsers.DocumentBuilderFactory

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource src = new InputSource("http://de.wikipedia.org/wiki/Right_Livelihood_Award")
Document xmlDocument = builder.parse(src.getByteStream());
DOMSource source = new DOMSource(xmlDocument);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer(xsltSource);
transformer.transform(source, new StreamResult(System.out));
-1
ответ дан 14 December 2019 в 01:11
поделиться

Попробуйте настроить функцию в DocumentBuilderFactory:

URL url = new URL(urlString);
InputStream is = url.openStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder db;
db = dbf.newDocumentBuilder();
Document result = db.parse(is);

Прямо сейчас у меня возникают те же проблемы внутри XSLT (2) при вызове функции документа для анализа внешних XHTML-страниц.

3
ответ дан 14 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

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