Scala 解析 XML

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
公众号:数据与算法联盟

个人网站:http://thinkgamer.github.io

在使用Spark时,有时候主函数入口参数过多的时候,会特别复杂,这个时候我们可以将相应的参数写在xml文件中,然后只要将xml文件的路径传进去即可,这里的xml路径可以是本地的,也可以是hdfs上的。

scala提供了类似于Xpath的语法来解析xml文件,其中很重要的两个操作符是""
和 “\”

  • \ :根据搜索条件得到下一个节点
  • \\ :根据条件获取所有的节点
<configure>
    <input>
        <name>app_feature_goods</name>
        <hdfs>/user/path/to/goods</hdfs>
    </input>
    <input>
        <name>app_feature_user</name>
        <hdfs>/user/path/to/user</hdfs>
    </input>
</configure>
val input = args(0)
val xml = XML.load(input)


// 找到所有的一级节点 input
val input_list = xml\"input"
input_list.foreach(println)

// 遍历每个一级节点,得到具体的值
for(one <- input_list){
    println(one\"name")
    println((one\"name").text)
    println(one\"hdfs")
    println((one\"hdfs").text)
}

// 得到所有的name
val name_list = xml\\"name"
name_list.map(one => one.text).foreach(println)

// 获取所有hdfs
val hdfs_list = xml\\"hdfs"
hdfs_list.map(one => one.text).foreach(println)

// 获取具有class的值
println(xml\"input"\"name"\\"@class")

// 打印出具有class属性的name值和hdfs值
println((xml\\"name").filter(_.attribute("class").exists(_.text.equals("test"))).text)
println((xml\\"hdfs").filter(_.attribute("class").exists(_.text.equals("test"))).text)

打印出的信息为:

<input>
        <name>app_feature_goods</name>
        <hdfs>/user/path/to/goods</hdfs>
    </input>
<input>
        <name>app_feature_user</name>
        <hdfs>/user/path/to/user</hdfs>
    </input>
<input>
        <name class="test">app_feature_user_test</name>
        <hdfs class="test">/user/path/to/user_test</hdfs>
    </input>
-------------
<name>app_feature_goods</name>
app_feature_goods
<hdfs>/user/path/to/goods</hdfs>
/user/path/to/goods
<name>app_feature_user</name>
app_feature_user
<hdfs>/user/path/to/user</hdfs>
/user/path/to/user
<name class="test">app_feature_user_test</name>
app_feature_user_test
<hdfs class="test">/user/path/to/user_test</hdfs>
/user/path/to/user_test
-------------
app_feature_goods
app_feature_user
app_feature_user_test
-------------
/user/path/to/goods
/user/path/to/user
/user/path/to/user_test
-------------
test
-------------
app_feature_user_test
/user/path/to/user_test
-------------

Process finished with exit code 0


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值