سكالا XML \\ نسخ XMLNS السمة. لماذا وكيف يمكنني التوقف عن ذلك؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

في سكالا REPL:

val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>

input\\@"innerTag"

و=>

<innerTag xmlns="http://xyz"> </innerTag>

وكيف يمكنني إيقاف سكالا قيام بذلك؟ لماذا لا مجرد تعطيني <innerTag> </innerTag>؟ كيف يمكنني التوقف عن هذا يحدث (أو إزالة سمات xmlns ببساطة)؟

وشكرا!

وجو

وتوضيح: مهمتي العامة وتقطيع ملف XML وإعادة توحيد ذلك. لذا ستتخذ هذه العقدة من تحت عقدة الجذر (التي لديها سمة XMLNS) ومن ثم دمجها مرة أخرى إلى وثيقة تحت الجذر الذي له مرة أخرى XMLNS.

هل كانت مفيدة؟

المحلول

في مستند الإدخال، <innerTag> لديه "http://xyz" مساحة منطقية لأن عنصر <outerTag> الأم زيارتها أن مساحة الاسم. هذه هي الطريقة التي تعمل بمساحات XML.

وعندما تسأل عن العنصر <innerTag> من تلقاء نفسها، سكالا نسخ تصريح مساحة اسم من <outerTag> الأم، لأن مساحة الاسم هو الجزء المنطقي من <innerTag>، حتى لو كان لم يذكر صراحة في الوثيقة الأولية.

إذا كنت ترغب في إزالة مساحة الاسم، سيكون لديك لتنفيذ بعض معالجة إضافية للقيام بذلك.

نصائح أخرى

استخدم اسمه المعلمة وElem.copy () في سكالا 2.8.0:

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

وأو أنا مدلل جدا مع سكالا لأعتقد أن هذا هو معقد أكثر من اللازم؟

وركضت إلى نوع من مشكلة مماثلة عند تطبيق التحويلات إلى العقد الفرعية وثيقة. وكان العقد مما أدى جميع 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