我必须将字符串转换为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) 有没有办法在scala的cdata部分中放置一个变量
val reason = <reason><![CDATA[ {failedReason} ]]></reason>
Run Code Online (Sandbox Code Playgroud) 我试图在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) 我认为这个问题可能没有令人满意的答案,但无论如何我都会问它,以防我错过了什么.
基本上,我想在给定元素实例的情况下找出源文档中源自某个XML元素的行.我希望这只是为了更好的诊断错误消息 - XML是配置文件的一部分,如果它有问题,我希望能够将错误消息的读者指向XML文档中的正确位置所以他可以纠正错误.
我知道标准的Scala XML支持可能没有这样的内置功能.毕竟,NodeSeq用这样的信息注释每个单独的实例是浪费的,并不是每个XML元素都有一个源文档,从中解析它.在我看来,标准的Scala XML解析器抛出了行信息,后来无法检索它.
但是切换到另一个XML框架不是一种选择.为了更好的诊断错误消息而"仅"添加另一个库依赖项对我来说似乎不合适.此外,尽管有一些缺点,我真的很喜欢XML的内置模式匹配支持.
我唯一的希望是,您可以向我展示一种方法来更改或子类化标准Scala XML解析器,以便它生成的节点将使用源行的编号进行注释.也许NodeSeq可以为此创建一个特殊的子类.或者也许只能Atom进行子类化,因为NodeSeq它太动态了?我不知道.
无论如何,我的希望接近于零.我不认为解析器中有一个位置可以挂钩以更改节点的创建方式,并且在该位置可以获得行信息.不过,我想知道为什么我之前没有找到这个问题.如果这是重复的,请指出原件.
我想选择名为"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中吗?
我想用宏转换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.xml.PrettyPrinter在Scala中格式化我的XML.问题在于没有文本内容的节点.而不是这个:
<node></node>
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个:
<node />
Run Code Online (Sandbox Code Playgroud)
我怎样才能让PrettyPrinter按照我的方式进行格式化?
scala ×7
scala-xml ×7
xml ×4
apache-flink ×1
cdata ×1
formatting ×1
maven ×1
scala-2.8 ×1
scala-macros ×1
string ×1