shu*_*tle 2 xml scala namespaces anti-xml
Anti-xml将成为Scala中的后继xml库.但我发现了一些怪癖的东西.
输入
package com.twitter.sample
import com.codecommit.antixml._
object ReadingNamespaceXml extends Application{
val xml = <tra:route xmlns:tra="trace">
<spo:id xmlnls:spo="sport">23232322</spo:id>
<tra:service ref="go" xsi:type="ref:manualService" xmlns:ref="ServiceRef"/>
</tra:route>.convert
val route = xml \ "route"
Console println route.unselect
}
Run Code Online (Sandbox Code Playgroud)
输出:
<tra:route>
<spo:id xmlnls:spo="sport">23232322</spo:id>
<tra:service xsi:type="ref:manualService" ref="go"/>
</tra:route>
Run Code Online (Sandbox Code Playgroud)
因此,输入xml和输出不一样.为什么?
答案就是这是一个错误.
幸运的是,有一个简单的解决方案.我不知道关于Anti-XML的完整故事,但Daniel Spiewak似乎不再维持它 - 他的回购多年来没有被触及,而且仍然在Scala 2.9.1上.然而,有一个分支(由一家名为Arktekk的公司)修复了这个bug,有2.10的构建,等等.它也可以从Maven Central获得.我对Arktekk一无所知,但我很高兴使用这个叉子一段时间.
为了证明它有效,这里是使用旧的0.3版本的简化示例:
scala> import com.codecommit.antixml._
import com.codecommit.antixml._
scala> <foo ref="bar" xmlns:ref="baz"/>.convert
res0: com.codecommit.antixml.Elem = <foo ref="bar"/>
Run Code Online (Sandbox Code Playgroud)
而现在Arktekk的0.5.1:
scala> import com.codecommit.antixml._
import com.codecommit.antixml._
scala> <foo ref="bar" xmlns:ref="baz"/>.convert
res0: com.codecommit.antixml.Elem = <foo xmlns:ref="baz" ref="bar"/>
Run Code Online (Sandbox Code Playgroud)
这是你所期望的.