scala读取xml的原始坑!“ columnNumber: 1; 前言中不允许有内容。”
用spark搞机器学习,需要从XML中读取训练数据,代码是这样的
val fileName = "data\\Posts.small1.xml"
val textFile = sc.textFile(fileName)
//移除xml的页眉和页脚
val postsXml = textFile.map(_.trim).
filter(!_.startsWith("<?xml version=")).
filter(_ != "<posts>").
filter(_ != "</posts>")
println("取出也没和页脚")
//Scala语言自动转换所有xml代码,像“<a>”转换到实际标签“<a>”。
// 我们也将连接标题和主体、移除所有的不必要的标签以及来自主体和所有空间副本的新行字符。
val postsRDD = postsXml.map { s =>
val xml = XML.loadString(s)
val id = (xml \ "@Id").text
val tags = (xml \ "@Tags").text
val title = (xml \ "@Title").text
val body = (xml \ "@Body").text
val bodyPlain = ("<\\S+>".r).replaceAllIn(body, " ")
val text = (title + " " + bodyPlain).replaceAll("\n", " ").replaceAll("( )+", " ");
Row(id, tags, text)
}
百度娘子告诉我:造成该异常原因:配置文件头部配置的xsd版本信息不正确,造成解析时出错。
遇到这样的bug是因为xml文件第一句出错。
解决方法:
1、确保xml的第一句<?xml version="1.0" encoding="UTF-8"?>之前没有空格。
2、复制网上的xml文件的时候,建议这一句<?xml version="1.0" encoding="UTF-8"?>不要复制,保留生成文件的时候生成的这句代码<?xml version="1.0" encoding="UTF-8"?>,这样就能避免这种bug出现。
把xml文件用EditPlus之类的工具打开,再保存为UTF-8编码,不是UTF-8+DOM。