我有一个用户定义的函数,如下所示
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 " "> <!ENTITY ndash "–"><!ENTITY mdash "—">]><body>${body}></body>""")//.replace("<", "<").replace(">", ">")
// 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 文档和格式不正确的 XML 文档的字符串。
(很遗憾你花了很多时间尝试,因为计算机科学理论会告诉你这个问题是无法解决的......)
实现此目的的实际方法是将输入提交给 XML 解析器,并在解析失败时捕获异常。
对于其他看到此内容的人,我可以使用 regexp_replace 替换无效的 xml 字符。此解决方案仅针对单个字符,允许您保留字符串的其余部分(如果它有效)。
显示变化的示例:
import org.apache.spark.sql.functions.regexp_replace
case class soExample(firstName: String)
val df_before = Seq(soExample("SANTANGELO")).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: [SANTANGELO]
// After: [SANTANGELO]