Разве Scala/Java не уважает w3 “избыточные транспортные спецификации” даты?

@Emperor XLII

мне нравится звук комбинаторных тестов в MbUnit, я попробовал метод испытания интерфейса абстрактного базового класса NUnit, и хотя это действительно работает, у Вас должно было бы быть отдельное тестовое приспособление для каждого интерфейса, который реализует класс (так как в C# нет никакого множественного наследования - хотя внутренние классы могут использоваться, который довольно прохладен). В действительности это прекрасно, возможно, даже выгодное, потому что это группирует Ваши тесты для класса с реализацией интерфейсом. Но было бы хорошо, если платформа могла бы быть более умной. Если я мог бы использовать атрибут для маркировки класса как 'официальный' тестовый класс для интерфейса, и платформа будет искать блок под тестом для всех классов, которые реализуют интерфейс и запускают те тесты на нем.

, Который был бы прохладен.

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

8 ответов

Работает. После некоторой детективной работы, подробности, насколько я могу их понять:

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

Я начал сомневаться, была ли это ошибка в источниках или в программе, поэтому я начал поиски и это похоже на постоянную проблему - с множеством обращений Google и SO по той же теме. Это, к сожалению, заставило меня сосредоточиться на восходящих (языковых) аспектах ошибки, вместо того, чтобы искать неисправности в самих источниках.

Быстрая перемотка вперед, и анализатор внезапно работает с исходным исходным выходным XML. Я подтвердил, что была проделана дополнительная работа на стороне сервера (просто сумасшедшее совпадение?). У меня нет ни того, ни другого XML, но подозреваю, что это связано с изменяемыми идентификаторами документов.

Теперь синтаксический анализатор отлично работает с интерфейсом RESTful, а также с любым хорошо отформатированным XML, который я могу использовать. Он также не работает на всех XHTML DTD, которые я пробовал (например, www.w3.org). Это противоречит тому, что ожидает @SeanReilly, но, похоже, перекликается с тем, что говорится в W3 .

Я все еще новичок в Scala, поэтому не могу определить, есть ли у меня особый или типичный случай . Я также не могу быть уверен, что эта проблема не повторится у меня в другой форме в будущем. Кажется, что вытягивание XHTML продолжит вызывать эту ошибку, если только не будет использовано решение, аналогичное тем, которые предлагает @GClaramunt $ @ J-16 SDiZ. Я не совсем квалифицирован, чтобы знать, проблема ли это в языке или моя реализация решения (вероятно, более позднее)

Что касается ближайших временных рамок, я подозреваю, что лучшим решением было бы для меня убедиться, что что было возможно проанализировать этот источник XML - вместо того, чтобы видеть, что у других была такая же ошибка, и предполагать, что была функциональная проблема с языком.

Надеюсь, это поможет другим.

2
ответ дан 1 December 2019 в 02:46
поделиться

Я столкнулся с той же проблемой и не нашел элегантного решения (я подумываю опубликовать вопрос в списке рассылки Scala) Тем временем я обнаружил обходной путь: реализуйте свой собственный SAXParserFactoryImpl, чтобы вы могли установить f.setFeature (" http://apache.org/xml/features/disallow-doctype-decl ", true); свойство. Хорошо, что это не требует изменения кода в базе кода Scala (хотя я согласен, что это нужно исправить). реализовать свой собственный SAXParserFactoryImpl, чтобы вы могли установить f.setFeature (" http://apache.org/xml/features/disallow-doctype-decl ", true); свойство. Хорошо, что это не требует изменения кода в базе кода Scala (хотя я согласен, что это нужно исправить). реализовать свой собственный SAXParserFactoryImpl, чтобы вы могли установить f.setFeature (" http://apache.org/xml/features/disallow-doctype-decl ", true); свойство. Хорошо, что это не требует изменения кода в базе кода Scala (хотя я согласен, что это нужно исправить). Сначала я расширяю фабрику парсеров по умолчанию:

package mypackage;

public class MyXMLParserFactory extends SAXParserFactoryImpl {
      public MyXMLParserFactory() throws SAXNotRecognizedException, SAXNotSupportedException, ParserConfigurationException {
        super();
        super.setFeature("http://xml.org/sax/features/validation", false);
        super.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false); 
        super.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
        super.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
      } 
    }

Ничего особенного, я просто хочу иметь возможность установить свойство.

(Примечание: это простой код Java, скорее всего, вы можете написать то же самое и на Scala)

И в своем коде Scala вам необходимо настроить JVM для использования вашей новой фабрики:

System.setProperty("javax.xml.parsers.SAXParserFactory", "mypackage.MyXMLParserFactory");

Затем вы может вызывать XML.load без проверки

11
ответ дан 1 December 2019 в 02:46
поделиться

Without addressing, for now, the problem, what do you expect to happen if the function request return false below?

def fetchAndParseURL(URL:String) = {      
  val (true, body) = Http request(URL)

What will happen is that an exception will be thrown. You could rewrite it this way, though:

def fetchAndParseURL(URL:String) = (Http request(URL)) match {      
  case (true, body) =>      
    val xml = XML.load(body)
    "True"
  case _ => "False"
}

Now, to fix the XML parsing problem, we'll disable DTD loading in the parser, as suggested by others:

def fetchAndParseURL(URL:String) = (Http request(URL)) match {      
  case (true, body) =>
    val f = javax.xml.parsers.SAXParserFactory.newInstance()
    f.setNamespaceAware(false)
    f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    val MyXML = XML.withSAXParser(f.newSAXParser())
    val xml = MyXML.load(body)
    "True"
  case _ => "False"
}

Now, I put that MyXML stuff inside fetchAndParseURL just to keep the structure of the example as unchanged as possible. For actual use, I'd separate it in a top-level object, and make "parser" into a def instead of val, to avoid problems with mutable parsers:

import scala.xml.Elem
import scala.xml.factory.XMLLoader
import javax.xml.parsers.SAXParser
object MyXML extends XMLLoader[Elem] {
  override def parser: SAXParser = {
    val f = javax.xml.parsers.SAXParserFactory.newInstance()
    f.setNamespaceAware(false)
    f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    f.newSAXParser()
  }
}

Import the package it is defined in, and you are good to go.

7
ответ дан 1 December 2019 в 02:46
поделиться

Это проблема Scala. В встроенной Java есть возможность отключить загрузку DTD:

f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

В scala нет эквивалента.

Если вы хотите исправить это самостоятельно, проверьте scala / xml / parsing / FactoryAdapter.scala и поместите строку в

278   def loadXML(source: InputSource): Node = {
279     // create parser
280     val parser: SAXParser = try {
281       val f = SAXParserFactory.newInstance()
282       f.setNamespaceAware(false)

<- вставьте сюда

283       f.newSAXParser()
284     } catch {
285       case e: Exception =>
286         Console.err.println("error: Unable to instantiate parser")
287         throw e
288     }
2
ответ дан 1 December 2019 в 02:46
поделиться

My knowledge of Scala is pretty poor, but couldn't you use ConstructingParser instead?

  val xml = new java.io.File("xmlWithDtd.xml")
  val parser = scala.xml.parsing.ConstructingParser.fromFile(xml, true)
  val doc = parser.document()
  println(doc.docElem)
0
ответ дан 1 December 2019 в 02:46
поделиться

There are two problems with what you are trying to do:

  • Scala's xml parser is trying to physically retrieve the DTD when it shouldn't. J-16 SDiZ seems to have some advice for this problem.
  • The Stack overflow page you are trying to parse isn't XML. It's Html4 strict.

The second problem isn't really possible to fix in your scala code. Even once you get around the dtd problem, you'll find that the source just isn't valid XML (empty tags aren't closed properly, for example).

You have to either parse the page with something besides an XML parser, or investigate using a utility like tidy to convert the html to xml.

1
ответ дан 1 December 2019 в 02:46
поделиться

Для scala 2.7.7 мне удалось это сделать с помощью scala.xml.parsing.XhtmlParser

0
ответ дан 1 December 2019 в 02:46
поделиться

Настройка переключателей Xerces работает только при использовании Xerces. Резольвер сущности работает для любого парсера JAXP.

Есть более обобщенные резольверы сущности, но эта реализация делает трюк, когда все, что я пытаюсь сделать - это разобрать корректный XHTML.

http://code.google.com/p/java-xhtml-cache-dtds-entityresolver/

Показывает, насколько тривиальным является кэширование DTD и отказ от сетевого трафика.

В любом случае, это , как я исправлю это. Я всегда забываю. Я всегда получаю ошибку. Я всегда иду за этим резольвером. Тогда я снова в деле.

0
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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