如何确定 Apache Spark 和 scala 中的无效 XML 字符串

问题描述 投票:0回答:2

我有一个用户定义的函数,如下所示

  case class bodyresults(text:String,code:String)

val bodyudf = udf{ (body: String)  =>

//Appending body tag explicitly to the xml before parsing  
val xmlElems = xml.XML.loadString(s"""<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE body [<!ENTITY nbsp "&#160;"> <!ENTITY ndash "&#8211;"><!ENTITY mdash "&#8212;">]><body>${body}></body>""")//.replace("&lt;", "<").replace("&gt;", ">")
// extract the code inside the req

val code = (xmlElems \\ "body" \\"code").text
val text = (xmlElems \\ "body").text.replace(s"${code}" ,"" )
bodyresults(text, code)
}

此函数将输入字符串分为代码和文本。

输入字符串看起来像这样

<p>I want to use a track-bar to change a form's opacity.</p>
<p>This is my code:</p>
 <pre><code>decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
 </code></pre>
<p>When I build the application, it gives the following error:</p>

此 Dataframe 列包含 100,000 条记录,并且某些输入字符串的 XML 格式不正确,并且在解析时会产生错误

我想检查输入字符串是否为正确的 XML 格式?

如果它们不是正确的 XML 格式,我想分配 code="0"、text="0" 以便稍后可以过滤它们。

我花了很多时间使用正则表达式来实现这一点,但无法做到。

有人可以建议我一种方法吗?

xml scala apache-spark xml-parsing
2个回答
0
投票

没有正则表达式可以区分格式正确的 XML 文档和格式不正确的 XML 文档的字符串。

(很遗憾你花了很多时间尝试,因为计算机科学理论会告诉你这个问题是无法解决的......)

实现此目的的实际方法是将输入提交给 XML 解析器,并在解析失败时捕获异常。


0
投票

对于其他看到此内容的人,我可以使用 regexp_replace 替换无效的 xml 字符。此解决方案仅针对单个字符,允许您保留字符串的其余部分(如果它有效)。

显示变化的示例:

import org.apache.spark.sql.functions.regexp_replace
case class soExample(firstName: String)
val df_before =  Seq(soExample("SANT￿ANGELO")).toDF
println(df_before.collect().head)
val df_after = df_before.withColumn("firstName", regexp_replace($"firstName", 0xffff.toChar.toString, ""))
println(df_after.collect().head)

// Before: [SANT￿ANGELO]
// After: [SANTANGELO]
© www.soinside.com 2019 - 2024. All rights reserved.