Вопрос по xml, scala, anti-xml – Можете ли вы использовать antixml для создания XML-документов?

8

Есть несколько примеров использования Anti-Xml для извлечения информации из документов XML, но я не смог найти ни одного примера использования Anti-Xml для создания документов XML. Поддерживает ли Anti-Xml создание документов или я должен использовать для этого другую библиотеку (какую?). У кого-нибудь есть пример создания XML-документа с помощью Anti-Xml?

На самом деле, я задал себе тот же вопрос некоторое время назад, потому что был недоволен отсутствием поддержки пространства имен с XML-литералами Scala. Поэтому я искал альтернативные библиотеки для создания моего XML. Для моего варианта использования ответ кажется отрицательным, судя по Трэвису & apos; ответ. ziggystar

Ваш Ответ

2   ответа
1

я придерживаюсь литералов Scala. Однако, если вы ищете лучшую альтернативу с хорошим компоновщиком DSL, обновлениями на месте, использованием XPath (на основе DSL и String) и т. Д., Тогда я предлагаю взглянуть на Scales. С сайта выпуска 0.3-RC5 (http://scala-scales.googlecode.com/svn/sites/scales/scales-xml_2.9.1/0.3-RC5/index.html):

val ns = Namespace("test:uri")
val nsa = Namespace("test:uri:attribs")
val nsp = nsa.prefixed("pre")

val builder = 
  ns("Elem") /@ (nsa("pre", "attr1") -> "val1",
               "attr2" -> "val2",
       nsp("attr3") -> "val3") /(
    ns("Child"),
    "Mixed Content",
    ns("Child2") /( ns("Subchild") ~> "text" )
  )

Также для прямой сериализации вы можете использовать потоковую передачу, поскольку модель Scales Xml объединяет модель для потоковой передачи и обработки на основе дерева.

Мне не хватает 0,3-RC6 со многими другими документами (и очень крутой платформой для сравнения XML), но я жду перехода на сонаты в первую очередь. (это на следующей неделе)

Вы знаете, существует ли библиотека XML, которая каким-то образом интегрирует XML-литералы Scala? Я думаю, что с макросами в 2.10 это может стать вполне возможным.
Я хотел бы взглянуть на это, но в настоящее время я поддерживаю 2.8.x, 2.9.x, и я хотел бы поддерживать 2.10.x равномерно. Добавление поддержки макросов для повторного использования литералов должно было бы стать другой библиотекой (но это не значит, что я этого не сделаю, просто чтобы посмотреть, возможно ли это). В соответствии с вашим комментарием, приведенным выше, полная поддержка пространства имен отсутствует, Scales ориентируется на пространства имен напрямую, вы просто не можете иметь неквалифицированное имя на любом сайте использования. (Асинхронный разбор следующий в моем списке).
5

import com.codecommit.antixml._

val doc = Elem(None, "doc", Attributes(), Map(), Group(
  Elem(None, "foo", Attributes("id" -> "bar"), Map(), Group(Text("baz")))
))

val writer = new java.io.StringWriter
val serializer = new XMLSerializer("UTF-8", true)

serializer.serializeDocument(doc, writer)

Вы также можете использовать Anti-XMLзастежки-молнии сделать некоторые интересные трюки редактирования:

val foos = doc \ "foo"
val newFoo = foo.head.copy(children = Group(Text("new text!")))
val newDoc = foos.updated(0, newFoo).unselect

СейчасnewDoc содержит отредактированный документ:

scala> newDoc.toString
res1: String = <doc><foo id="bar">new text!</foo></doc>

Zipper тотdoc \ "foo" возврат отличается отNodeSeq в том смысле, что он несет информацию о своем контексте, что позволяет вам «отменить» операция выбора сделана\.

Обновление в ответ наziggystarкомментарий ниже: если вы хотите что-то вроде XML-литералов Scala, вы можете просто использоватьconvert на любомscala.xml.Elem:

val test: com.codecommit.antixml.Elem = <test></test>.convert

Я предположил, что вопрос был о программном создании.

Ну, я думаю, что вопрос следует читать как & quot; Есть ли способ использовать Anti-Xml для создания документовin a convenient way? & Quot ;. Например, есть ли какой-нибудь DSL для создания документов? Конечно, вы можете вручную склеить классы реализации ...
@ziggystar: смотрите мое обновление & # x2014; вы можете просто использовать литералы Scala и конвертировать.

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