scala读取xml的原始坑!“ columnNumber: 1; 前言中不允许有内容。”

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)
    }


结果出现了著名的org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。错误。


百度娘子告诉我:造成该异常原因:配置文件头部配置的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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值