2012-05-02 4 views
8

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

+1

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

ответ

5

Да, вы можете построить (и сериализации) XML-документы:

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 «s ниже: если вы хотите что-то вроде XML литералов Scala, вы можете просто использовать convert на любом scala.xml.Elem:

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

Я предполагала, речь шла о программное создание.

+1

Ну, я думаю, вопрос должен быть прочитан как «Есть ли способ использовать Anti-Xml для создания документов * удобным способом *?». Как есть какой-то DSL для создания документов? Конечно, вы можете вручную склеить классы реализации ... – ziggystar

+0

@ziggystar: см. Мое обновление - вы можете просто использовать литералы Scala и конвертировать. –

1

Если вы не используете другие части анти-xml, я бы придерживался литературных произведений Скалы. Однако, если вы ищете лучшую альтернативу с красивым дизайнером DSL, обновления на месте, использование XPath (DSL и String) и т. Д., Я бы предложил посмотреть на весы. С сайта 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), но я жду, прежде всего, перехода на сонатип. (эта на следующей неделе)

+0

Знаете ли вы, существует ли библиотека XML, которая каким-то образом интегрирует XML-литералы Scala? Я думаю, что с макросами в 2.10 это может стать вполне возможным. – ziggystar

+0

У меня возникнет соблазн взглянуть на него, но в настоящее время я поддерживаю 2.8.x, 2.9.x, и я хотел бы поддерживать равномерно 2.10.x. Добавление поддержки макросов для повторного использования литералов должно было бы быть еще одним lib (не означает, что я не буду этого делать, просто чтобы увидеть, возможно ли это). В соответствии с вашим комментарием выше, хотя полная поддержка пространства имен отсутствует, масштабирует цели пространства имен напрямую, вы просто не можете иметь неквалифицированное имя на любом сайте использования. (Асинхронный разборка следующий в моем списке). – Chris

Смежные вопросы