2011-07-21 129 views
2

我对于最近来自java背景的Scala的工作比较陌生。从XML中提取元素名称和属性值

我正在寻求建议,以创建一种有效的读取XML文件的方式,并提取包含在括号之间数据的位置中的元素名称和属性。

例如

<一些名> {属性} <一些名称/>

所以关键是有包含在{}数据,其中

我当时想使用包含在{}之间的实际元素名称和属性值填充哈希映射。

我相信这不是太复杂,但考虑到我目前有限的Scala专业知识,我想在论坛内反对这个问题。

非常感谢任何人花时间回答。

+0

您可以举一个实际的输入示例,并且您想要添加什么键/值?可能会有比现在接受的答案更好的解决方案。 –

回答

0

[已更新] 刚刚意识到你已经在文本中询问了大括号,而不是关于xml相关的语法大括号。 可能的答案是:

scala> val xml = <a> 
        <prop>{{key1}}</prop> 
        <prop>{{key2}}</prop> 
        <prop>notkey</prop> 
       </a> 
xml: scala.xml.Elem = <a><prop>{key1}</prop><prop>{key2}</prop><prop>notkey</prop></a> 

我已经翻了一番{}逃脱牙套,因为Scala治疗{变量}作为替补:

scala> val text="all your base are belong to us" 
text: java.lang.String = all your base are belong to us 

scala> val template = <a>{text}</a> 
template: scala.xml.Elem = <a>all your base are belong to us</a> 

现在回去工作。
只能使用prop's使用\投影算子,它将带有给定名称的子节点。取得xml树中的所有sub-sub -...-子节点,而不是使用\\

scala> val props = xml\"prop" 
props: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>, <prop>notkey</prop>) 

val keys = props.filter (p => p.text.startsWith("{")) 
res3: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>) 

其实,我在这里受骗,以为所不期望的属性字段不能在形式上{存在notkey。您可以重写代码以其他方式过滤密钥(例如,使用正则表达式)

scala> for(k <- keys) { 
    | println(k.label+":"+k.text) 
    | } 
prop:{key1} 
prop:{key2} 
+0

om-nom-nom, 非常感谢, 这是我一直期待的指导和范例。 Gary – Gary

+0

@加里,那你为什么不接受答案呢? ;) –

+0

对不起,我忘了检查它是否被接受。 再次感谢。 – Gary