Scala – 修改xml中的嵌套元素

我正在学习scala,我正在寻找更新一个嵌套节点在一些xml。我有一些工作,但我想知道如果它的最优雅的方式。

我有一些xml:

val InputXml : Node =
<root>
    <subnode>
        <version>1</version>
    </subnode>
    <contents>
        <version>1</version>
    </contents>
</root>

我想更新子节点中的版本节点,但不是内容中的版本节点。

这里是我的功能:

def updateVersion( node : Node ) : Node = 
 {
   def updateElements( seq : Seq[Node]) : Seq[Node] = 
   {
        var subElements = for( subNode <- seq ) yield
        {
            updateVersion( subNode )
        }   
        subElements
   }

   node match
   {
     case <root>{ ch @ _* }</root> =>
     {
        <root>{ updateElements( ch ) }</root>
     }
     case <subnode>{ ch @ _* }</subnode> =>
     {
         <subnode>{ updateElements( ch ) }</subnode> 
     }
     case <version>{ contents }</version> =>
     {
        <version>2</version>
     }
     case other @ _ => 
     {
         other
     }
   }
 }

有更多的succint写这个函数的方法吗?

我认为原来的逻辑是好的。
这是相同的代码(我敢说吗?)更多的Scala-ish风味:

def updateVersion( node : Node ) : Node = {
   def updateElements( seq : Seq[Node]) : Seq[Node] = 
     for( subNode <- seq ) yield updateVersion( subNode )  

   node match {
     case <root>{ ch @ _* }</root> => <root>{ updateElements( ch ) }</root>
     case <subnode>{ ch @ _* }</subnode> => <subnode>{ updateElements( ch ) }</subnode>
     case <version>{ contents }</version> => <version>2</version>
     case other @ _ => other
   }
 }

它看起来更紧凑(但实际上是一样:))

>我摆脱了所有不必要的
括号
>如果需要支架,它开始
同一行
> updateElements只是定义了一个var
并返回它,所以我摆脱了
并直接返回结果

如果你想,你可以摆脱updateElements太。您要将updateVersion应用于序列的所有元素。这是map method.这样,你可以重写行

case <subnode>{ ch @ _* }</subnode> => <subnode>{ updateElements( ch ) }</subnode>

case <subnode>{ ch @ _* }</subnode> => <subnode>{ ch.map(updateVersion (_)) }</subnode>

因为更新版本只需要一个参数我99%肯定你可以省略它,写:

case <subnode>{ ch @ _* }</subnode> => <subnode>{ ch.map(updateVersion) }</subnode>

结束于:

def updateVersion( node : Node ) : Node = node match {
         case <root>{ ch @ _* }</root> => <root>{ ch.map(updateVersion )}</root>
         case <subnode>{ ch @ _* }</subnode> => <subnode>{ ch.map(updateVersion ) }</subnode>
         case <version>{ contents }</version> => <version>2</version>
         case other @ _ => other
       }

你怎么看?

http://stackoverflow.com/questions/970675/scala-modifying-nested-elements-in-xml

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Scala – 修改xml中的嵌套元素