Scala XML \\はxmlns属性をコピーします。なぜ、どうすれば止めることができますか?
-
05-07-2019 - |
質問
Scala REPLの場合:
val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>
input\\@"innerTag"
= <!> gt;
<innerTag xmlns="http://xyz"> </innerTag>
これを行うにはScalaを停止するにはどうすればよいですか?なぜ私に<innerTag> </innerTag>
を提供できないのですか?どうすればこの出来事を止めることができますか(または単にxmlns
属性を削除します)?
ありがとう!
ジョー
明確化: 私の全体的なタスクは、XMLファイルを切り刻み、それを再結合することです。そのため、このノードはルートノード(xmlns属性を持つ)の下から取得され、再びxmlnsを持つルートの下のドキュメントに統合されます。
解決
入力ドキュメントでは、<innerTag>
には論理名前空間"http://xyz"
があります。これは、親<outerTag>
要素にその名前空間が含まれていたためです。これがXML名前空間の仕組みです。
<=>要素を単独で要求すると、Scalaは親<=>から名前空間宣言をコピーします。これは、名前空間が<=>の論理部分であるためです。最初のドキュメント。
ネームスペースを削除する場合は、追加の処理を実行する必要があります。
他のヒント
Scala 2.8.0で名前付きパラメーターとElem.copy()を使用:
scala> import scala.xml._
import scala.xml._
scala> val outer = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>
outer: scala.xml.Elem = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>
scala> outer \\ "innerTag" map { case e: Elem => e.copy(scope = TopScope) }
res0: scala.xml.NodeSeq = <innerTag></innerTag>
神、私は何かが欠けているといいのですが。これはできないことはできません!
import scala.xml._
import scala.xml.tranform._
val rw = new RewriteRule {
override def transform(n: Node) = n match {
case Elem(p, l, a, s, children@ _*) => Elem(p, l, a, TopScope, children: _*)
case x => x
}
override def transform(ns: Seq[Node]): Seq[Node] = ns flatMap transform
}
val rt = new RuleTransformer(rw)
val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>
val result = input \\ "innerTag" map rt
または、私はScalaに甘やかされすぎて、これが過度に複雑だとは思いませんか?
ドキュメントのサブノードに変換を適用すると、同様の問題が発生しました。 結果のノードはすべて、ノード上にxmlnsを持ちました。
変換の完了後、次の関数を使用して、印刷のためにドキュメントを「クリーン」にしました。
def transformForPrinting(doc : Elem) : Elem = {
def stripNamespaces(node : Node) : Node = {
node match {
case e : Elem =>
e.copy(scope = TopScope, child = e.child map (stripNamespaces))
case _ => node;
}
}
doc.copy( child = doc.child map (stripNamespaces) )}
所属していません StackOverflow