Scala XML \\はxmlns属性をコピーします。なぜ、どうすれば止めることができますか?

StackOverflow https://stackoverflow.com/questions/1601691

  •  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) )}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top