Scala: разобрать HTML-фрагмент - PullRequest
       14

Scala: разобрать HTML-фрагмент

1 голос
/ 21 февраля 2012

Наша база данных хранит HTML фрагменты , например, f.ex. <p>A.</p><p>B.</p>. Я хочу включить фрагменты Html из базы данных в фрагмент Lift.

Чтобы сделать это, я попытался использовать XML.loadString() -метод для преобразования фреймажа в scala.xml.Elem, но это работает только для полных действительных XML-документов:

import scala.xml.XML
@Test
def doesnotWork() {
  val result = XML.loadString("<p>A</p><p>B</p>")
  assert(result === <p>A</p><p>B</p>)
}

@Test
def thisWorks() {
  val result = XML.loadString("<test><p>A</p><p>B</p></test>")
  assert(result === <test><p>A</p><p>B</p></test>)
}

Тест doesnotWork приводит к исключению:

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 10; The markup in the document following the root element must be well-formed.

Можно ли преобразовать только (действительные) фракции в XML?

Ответы [ 2 ]

5 голосов
/ 21 февраля 2012

Поскольку вы используете Lift, вы можете обернуть свой XML в lift:children в качестве обходного пути.Фрагмент Children просто возвращает дочерние элементы;и очень полезен для упаковки фрагментов, которые вам нужно проанализировать.

@Test
def thisAlsoWorks() {
  val result = XML.loadString("<lift:children><p>A</p><p>B</p></lift:children>")
  assert(result === <lift:children><p>A</p><p>B</p></lift:children>)
 }
3 голосов
/ 21 февраля 2012

Вам не нужен полный действительный документ XML, но вам нужен один тег верхнего уровня.

Как вы заметили, работает следующее:

XML.loadString("<fragment><p>A</p><p>B</p></fragment>")

Вы можетезатем либо сохраните последовательность Elem с, либо оберните их в пользовательский тег и извлеките последовательность, используя .descendant.

...