1.定义XML变量,可以直接将XML字面量赋值给常量,也可以用scala.xml.XML中的方法加载XML文档
直接赋值XML代码
val xmlFile = <symbols><symbol ticker="AAPL"><units>200</units></symbol><units>300</units><symbol ticker="IBM"><units>400</units></symbol> </symbols>
用loadFile方法加载XML对象
val xmlFile = XML.loadFile("myXml.xml")
用load方法加载输入流
val xmlFile = XML.load(new FileInputStream("myXml.xml"))
val xmlFile = XML.load(new InputStreamReader(new FileInputStream("myXml.xml"),"UTF-8")
用load方法加载URL
val xmlFile = XML.load(new URL("http://localhost/myXml.html")
2.操作XML节点
val xmlFile =
<symbols>
<symbol ticker="AAPL">
<units>200</units>
</symbol>
<units>300</units>
<symbol ticker="IBM">
<units>400</units>
</symbol>
</symbols>
a)获取子节点的值,但是,他并不会只取子节点的值,如果子节点还有子节点,会一直取到有值的子节点
for(i <- xmlFile.child){
println(i.text)//获取子节点的值
}
打印输出:
200
300
400
b)获取属性列表
for(x<-xmlFile.child){
println( x.attribute("ticker"))//获取属性值列表
}
打印输出:
Some(AAPL)//第一个节点的值列表
None//第二个节点的值列表,XML中为空,即为none
Some(IBM)//第三个节点的值列表
None//鬼知道这是什么玩意。。。
c)获取属性值
for(x<-xmlFile.child){
println( x\"@ticker")//获取属性值
}
打印输出:
AAPL
//没有即为空
IBM
d)获取子标签名称
for(x<-xmlFile.child){
println(x.label)//获取子节点的标签
}
打印输出:
symbol
units
symbol
备注:
比较坑爹的是,如果你的标签直接有空格,就会打印一个#PCDATA标签,比如
symbol
#PCDATA
units
symbol
e)当节点为空的时候返回true
for(x<-xmlFile.child){
println(x.isAtom)
}
比如在d中,存在空格,那
打印输出:
false
true
false
false
f)获取标签为symbol的所有节点主体
val symbol= xmlFile\"symbol"
symbol.map { x => println(x) }
打印输出:
<symbol ticker="AAPL"><units ticker="units">200</units></symbol>
<symbol ticker="IBM"><units>400</units></symbol>
这儿将xmlFile中的两个节点取出来了。
g)获取标签名、标签属性值、与本节点的值
val symbol= xmlFile\"symbol"
symbol.map { x => println(x.label+"-"+x\"@ticker"+"-"+x.text) }//输出symbol节点的ticker属性值和value值
打印输出:
symbol-AAPL-200
symbol-IBM-400
直接赋值XML代码
val xmlFile = <symbols><symbol ticker="AAPL"><units>200</units></symbol><units>300</units><symbol ticker="IBM"><units>400</units></symbol> </symbols>
用loadFile方法加载XML对象
val xmlFile = XML.loadFile("myXml.xml")
用load方法加载输入流
val xmlFile = XML.load(new FileInputStream("myXml.xml"))
val xmlFile = XML.load(new InputStreamReader(new FileInputStream("myXml.xml"),"UTF-8")
用load方法加载URL
val xmlFile = XML.load(new URL("http://localhost/myXml.html")
2.操作XML节点
val xmlFile =
<symbols>
<symbol ticker="AAPL">
<units>200</units>
</symbol>
<units>300</units>
<symbol ticker="IBM">
<units>400</units>
</symbol>
</symbols>
a)获取子节点的值,但是,他并不会只取子节点的值,如果子节点还有子节点,会一直取到有值的子节点
for(i <- xmlFile.child){
println(i.text)//获取子节点的值
}
打印输出:
200
300
400
b)获取属性列表
for(x<-xmlFile.child){
println( x.attribute("ticker"))//获取属性值列表
}
打印输出:
Some(AAPL)//第一个节点的值列表
None//第二个节点的值列表,XML中为空,即为none
Some(IBM)//第三个节点的值列表
None//鬼知道这是什么玩意。。。
c)获取属性值
for(x<-xmlFile.child){
println( x\"@ticker")//获取属性值
}
打印输出:
AAPL
//没有即为空
IBM
d)获取子标签名称
for(x<-xmlFile.child){
println(x.label)//获取子节点的标签
}
打印输出:
symbol
units
symbol
备注:
比较坑爹的是,如果你的标签直接有空格,就会打印一个#PCDATA标签,比如
symbol
#PCDATA
units
symbol
e)当节点为空的时候返回true
for(x<-xmlFile.child){
println(x.isAtom)
}
比如在d中,存在空格,那
打印输出:
false
true
false
false
f)获取标签为symbol的所有节点主体
val symbol= xmlFile\"symbol"
symbol.map { x => println(x) }
打印输出:
<symbol ticker="AAPL"><units ticker="units">200</units></symbol>
<symbol ticker="IBM"><units>400</units></symbol>
这儿将xmlFile中的两个节点取出来了。
g)获取标签名、标签属性值、与本节点的值
val symbol= xmlFile\"symbol"
symbol.map { x => println(x.label+"-"+x\"@ticker"+"-"+x.text) }//输出symbol节点的ticker属性值和value值
打印输出:
symbol-AAPL-200
symbol-IBM-400