Anti-Xmlを使用してXMLドキュメントから情報を抽出する例はいくつかありますが、Anti-Xmlを使用してXMLドキュメントを作成する例はありません。Anti-Xmlはドキュメントの作成をサポートしていますか、それともこれに別のライブラリを使用する必要がありますか(どれですか?)。Anti-Xmlを使用してXMLドキュメントを作成する例はありますか?
2 に答える
はい、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"
点でaとは異なります。NodeSeq
これにより、によって実行された選択操作を「元に戻す」ことができます\
。
以下のziggystarのコメントに応じて更新してください:ScalaのXMLリテラルのようなものが必要な場合は、次のいずれかで使用できconvert
ますscala.xml.Elem
。
val test: com.codecommit.antixml.Elem = <test></test>.convert
質問はプログラムによる作成に関するものだと思いました。
あなたがanti-xmlの他の部分を使用していない限り、私はScalaのリテラルに固執するでしょう。ただし、優れたビルダーDSL、インプレース更新、XPathの使用法(DSLおよび文字列ベース)などを使用したより良い代替手段を探している場合は、スケールを確認することをお勧めします。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比較フレームワーク)がありますが、最初にsonatypeに移行するのを待っています。(来週のイータ)