我正在学习scala,我正在寻找更新某个xml中的嵌套节点.我有一些工作,但我想知道它是否是最优雅的方式.
我有一些xml:
val InputXml : Node =
<root>
<subnode>
<version>1</version>
</subnode>
<contents>
<version>1</version>
</contents>
</root>
Run Code Online (Sandbox Code Playgroud)
我想更新版本的节点的子节点,而不是一个在内容.
这是我的功能:
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 @ _* …Run Code Online (Sandbox Code Playgroud) 我正在学习Scala,所以这可能是非常棒的.
我想要一个多行正则表达式.
在Ruby中它将是:
MY_REGEX = /com:Node/m
Run Code Online (Sandbox Code Playgroud)
我的Scala看起来像:
val ScriptNode = new Regex("""<com:Node>""")
Run Code Online (Sandbox Code Playgroud)
这是我的匹配功能:
def matchNode( value : String ) : Boolean = value match
{
case ScriptNode() => System.out.println( "found" + value ); true
case _ => System.out.println("not found: " + value ) ; false
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
matchNode( "<root>\n<com:Node>\n</root>" ) // doesn't work
matchNode( "<com:Node>" ) // works
Run Code Online (Sandbox Code Playgroud)
我试过了:
val ScriptNode = new Regex("""<com:Node>?m""")
Run Code Online (Sandbox Code Playgroud)
我真的想避免使用java.util.regex.Pattern.任何提示非常感谢.
我在Nabble上看到了以下示例,其目标是返回包含属性为X且包含值Y的属性的所有节点:
//find all nodes with an attribute "class" that contains the value "test"
val xml = XML.loadString( """<div>
<span class="test">hello</span>
<div class="test"><p>hello</p></div>
</div>""" )
def attributeEquals(name: String, value: String)(node: Node) =
{
node.attribute(name).filter(_==value).isDefined
}
val testResults = (xml \\ "_").filter(attributeEquals("class","test"))
//prints: ArrayBuffer(
//<span class="test">hello</span>,
//<div class="test"><p>hello</p></div>
//)
println("testResults: " + testResults )
Run Code Online (Sandbox Code Playgroud)
作为对此的扩展,将如何执行以下操作:查找包含任何包含值Y的属性的所有节点:
//find all nodes with any attribute that contains the value "test"
val xml = XML.loadString( """<div>
<span class="test">hello</span>
<div id="test"><p>hello</p></div>
<random any="test"/></div>""" )
//should return: …Run Code Online (Sandbox Code Playgroud) 我正在学习有关创建自定义按钮的教程.如果我直接将该样式应用于该按钮它可以工作,但如果我使用android:buttonStyle它将样式应用于主题则不起作用.
示例 - 以下是应用了按钮样式的样式xml:values/styles.xml
<resources>
<style name="MyTheme" parent="android:Theme.Light">
<!-- the button gets styled but is no longer clickable
if i do it like this -->
<item name="android:buttonStyle">@style/ButtonText</item>
</style>
<style name="ButtonText">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#ffffff</item>
<item name="android:background">@drawable/ruddy_orange_button</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
绘制/ ruddy_orange_button.xml:
<item android:state_pressed="true">
<shape>
<solid android:color="#70c656" />
<stroke android:width="1dp" android:color="#53933f" />
<corners android:radius="3dp" />
<padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
</shape>
</item>
<item>
<shape>
<gradient android:angle="270" android:endColor="#fd4d4d" android:startColor="#f24b4b" />
<stroke android:width="1dp" android:color="#f04a4a" />
<corners android:radius="4dp" …Run Code Online (Sandbox Code Playgroud) 我有一些xml:
<item name="ed" test="true"
xmlns="http://www.somenamespace.com"
xmlns:xsi="http://www.somenamespace.com/XMLSchema-instance">
<blah>
<node>value</node>
</blah>
</item>
Run Code Online (Sandbox Code Playgroud)
我想通过这个xml并完全删除所有命名空间,无论它们在哪里.我如何使用Scala执行此操作?
<item name="ed" test="true">
<blah>
<node>value</node>
</blah>
</item>
Run Code Online (Sandbox Code Playgroud)
我一直在看RuleTransform和复制属性等,但我可以删除命名空间或删除属性但不删除命名空间并保留属性.
我想更改一些返回的 api:Validation[E,A],以异步方式,所以理想情况下:Future[Validation[E,A]]。不过我希望能够用于理解这些。
考虑以下示例:
import scala.concurrent.{Await, ExecutionContext, Future}
import ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scalaz.{Failure, Success, Validation}
def getName : Future[Validation[Int,String]] = {
Future{
Success("ed")
}
}
def useName(name:String) : Future[Validation[Int,String]] = {
Future{
Success(s"hi $name")
}
}
val name : Future[Validation[Int,String]] = getName.flatMap{ v =>
v match {
case Success(name) => useName(name)
case Failure(e) => Future(Failure(e))
}
}
Await.result(name, 1.second)
Run Code Online (Sandbox Code Playgroud)
为了获得name,我需要从验证中获取成功的值,并useName使用该值进行调用。
有没有办法我可以按照这些思路做一些事情:
val name : Future[Validation[Int,String]] = for{
n <- getName
b <- …Run Code Online (Sandbox Code Playgroud) 如果项目在调试模式下运行,是否有办法有条件地禁用分叉:
sbt -jvm-debug 9999
Run Code Online (Sandbox Code Playgroud)
然后在我的构建中:
fork in Test := {
//find a key that lets me know if debugging in set up
!isDebugging.value
}
Run Code Online (Sandbox Code Playgroud)