2016-01-28 5 views
0

У меня проблема, похожая на Scala - modifying nested elements in xml Я воспроизвел тот же код в этом посте. Я пытаюсь изменить содержимое в элементе, и мне нужно вызвать функцию для получения содержимого. Напр.Изменение содержимого xml scala

object test extends App { 
    val InputXml: Node = 
    <root> 
     <contents> 
     <version>1</version> 
     </contents> 
    </root> 

    object t1 extends RewriteRule { 
    override def transform(n: Node): Seq[Node] = { 
     println("transforming '" + n + "'") 
     n match { 
     case Elem(prefix, "version", attribs, scope, _*) => 
      Elem(prefix, "version", attribs, scope, true, Text(computeVersion())) 

     case other => other 
     } 
    } 

    def computeVersion() = { 
     println("computeVersion called") 
     "3.0" 
    } 
    } 

    object rt1 extends RuleTransformer(t1) 
    val res = rt1(InputXml) 
    val pp = new PrettyPrinter(width = 2, step = 1) 
    Console println (pp format res) 
} 

Выход:

transforming ' ' 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '<contents> <version>3.0</version></contents>' 
transforming ' ' 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '<contents> <version>3.0</version></contents>' 
transforming '<root><contents> <version>3.0</version></contents></root>' 
<root><contents> <version>3.0</version></contents></root> 

computeVersion() становится называется почти каждый раз, когда из-за сложности. Я бы просто хотел, чтобы это вызывалось, когда обрабатывается фактический тег. Я попытался окружить его шаблонами соответствия, например, поиск <version>, который действительно не работает.
Любые предложения?

+0

Не могли бы вы дать немного больше деталей и, возможно, объяснить, какую ошибку вы получаете. – wwkudu

+0

У меня есть вопрос. – user3044440

+0

Я посмотрел и нашел это довольно запутанным. Что-то связано с тем, как RewriteRule и преобразовать работу, но еще не успел ее разгадать. Надеюсь, кто-то более знающий весит. – wwkudu

ответ

0

У меня это исправлено. Этот вопрос решается в https://github.com/scala/scala-xml/issues/58

Несмотря на то, что исправление доступно в версии scala версии 2.12-M3 (на сегодняшний день), такие люди, как я, которые используют версию scala версии 2.11, могут переопределить метод преобразования в классе и вставить код, который is

def transform(ns: Seq[Node]): Seq[Node] = { 
    val changed = ns flatMap transform 
    if (changed.length != ns.length || (changed, ns).zipped.exists(_ != _)) changed 
else ns 
} 
Смежные вопросы