标签: scala-xml

scala String to scala.xml.Elem

我必须将字符串转换为XML

scala> val string="<play><scala></scala></play>"
string: String = <play><scala></scala></play>

scala> val xml=(<play><scala></scala></play>)
xml: scala.xml.Elem = <play><scala></scala></play>
Run Code Online (Sandbox Code Playgroud)

xml string scala scala-xml

31
推荐指数
1
解决办法
2万
查看次数

Scala中的CDATA变量

有没有办法在scala的cdata部分中放置一个变量

val reason = <reason><![CDATA[ {failedReason} ]]></reason>
Run Code Online (Sandbox Code Playgroud)

scala cdata scala-xml

13
推荐指数
2
解决办法
2414
查看次数

如何在Apache Flink中使用Scala XML?

我试图在Flink中使用Scala XML库来解析XML,但我无法使其工作.请注意,我需要在相同的处理函数中对我的代码使用序列化和非序列化(字符串)版本.

我尝试过不同的解决方案,它们总是在IntelliJ中工作,但是当我在Flink集群上运行时却没有.他们总是回归不同java.lang.LinkageError: com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl$JAXPSAXParser; 我尝试了很多东西,但我仍然得到类似于这个的错误.

这是我的Flink Job的样子:

object StreamingJob {
  import org.apache.flink.streaming.api.scala._

  val l = List(
    """<ciao>ciao</ciao>""",
  )

  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    // set up kafka section excluded
    env.setParallelism(10)

    val stream = env.fromCollection(l)

    stream
      .uid("process")
      .map(new Processor)
      .print

    env.execute("Flink-TEST")
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的处理功能的一个例子:

import javax.xml.parsers.{SAXParser, SAXParserFactory}
import org.apache.flink.api.common.functions.MapFunction
import scala.xml.{Elem, XML}
import scala.xml.factory.XMLLoader

class Processor extends MapFunction[String, String] {
  override def map(translatedMessage: String): String = {
    val xml = Processor.xmlLoader.loadString(translatedMessage)
    xml.toString
  }
} …
Run Code Online (Sandbox Code Playgroud)

scala maven scala-xml maven-shade-plugin apache-flink

11
推荐指数
1
解决办法
205
查看次数

如何跟踪XML元素的源代码行(位置)?

我认为这个问题可能没有令人满意的答案,但无论如何我都会问它,以防我错过了什么.

基本上,我想在给定元素实例的情况下找出源文档中源自某个XML元素的行.我希望这只是为了更好的诊断错误消息 - XML是配置文件的一部分,如果它有问题,我希望能够将错误消息的读者指向XML文档中的正确位置所以他可以纠正错误.

我知道标准的Scala XML支持可能没有这样的内置功能.毕竟,NodeSeq用这样的信息注释每个单独的实例是浪费的,并不是每个XML元素都有一个源文档,从中解析它.在我看来,标准的Scala XML解析器抛出了行信息,后来无法检索它.

但是切换到另一个XML框架不是一种选择.为了更好的诊断错误消息而"仅"添加另一个库依赖项对我来说似乎不合适.此外,尽管有一些缺点,我真的很喜欢XML的内置模式匹配支持.

我唯一的希望是,您可以向我展示一种方法来更改或子类化标准Scala XML解析器,以便它生成的节点将使用源行的编号进行注释.也许NodeSeq可以为此创建一个特殊的子类.或者也许只能Atom进行子类化,因为NodeSeq它太动态了?我不知道.

无论如何,我的希望接近于零.我不认为解析器中有一个位置可以挂钩以更改节点的创建方式,并且在该位置可以获得行信息.不过,我想知道为什么我之前没有找到这个问题.如果这是重复的,请指出原件.

xml scala scala-2.8 scala-xml

10
推荐指数
1
解决办法
1474
查看次数

在scala中选择节点的所有子元素

我想选择名为"a"的节点的第一个孩子Elem.我现在得到的是:

(xml \ "a")(0).child.collect {case e: Elem => e}
Run Code Online (Sandbox Code Playgroud)

这非常冗长.我在寻找类似的东西:

xml \ "a" \ "*"
Run Code Online (Sandbox Code Playgroud)

这可能在scala中吗?

xml scala scala-xml

9
推荐指数
2
解决办法
5983
查看次数

在Scala宏中匹配XML文字

我想用宏转换Scala XML文字.(不是带XML的字符串文字,而是实际的XML文字).据我所知,XML文字实际上并没有构建在AST级别的语言中,而是在解析器中被贬低.有趣的是,这确实有效:

case q"<specificTag></specificTag>" => ... // succeeds for specificTag with no
                                           // attributes and children
Run Code Online (Sandbox Code Playgroud)

但显然,这完全没用,因为不可能以任意方式匹配任意xml.就像是

case q"<$prefix:$label ..$attrs>$children</$prefix:$label>" => ...
Run Code Online (Sandbox Code Playgroud)

无法工作,因为我们必须在模式中绑定相同的变量两次.

打印出这样的xml文字表达式的树实际上给出了desugared版本.例如.

new _root_.scala.xml.Elem(null,"specificTag",_root_.scala.xml.Null,$scope,false)
Run Code Online (Sandbox Code Playgroud)

但尝试匹配此失败:

case q"new _root_.scala.xml.Elem(..$params)" => ... // never succeeds
Run Code Online (Sandbox Code Playgroud)

我很迷惑!我的问题是:有没有办法可靠地匹配scala宏中的任意xml litarals?另外:为什么它们在quasiquotes中支持常量xml而不是desugared值呢?

scala scala-xml scala-macros scala-quasiquotes

8
推荐指数
1
解决办法
481
查看次数

scala.xml.PrettyPrinter在没有文本的情况下格式化较短的节点

我使用scala.xml.PrettyPrinter在Scala中格式化我的XML.问题在于没有文本内容的节点.而不是这个:

<node></node>
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个:

<node />
Run Code Online (Sandbox Code Playgroud)

我怎样才能让PrettyPrinter按照我的方式进行格式化?

xml formatting scala scala-xml

3
推荐指数
1
解决办法
407
查看次数