从XML中提取元素名称和属性值

时间:2011-07-21 14:34:09

标签: xml scala

我最近刚刚从Java背景中学习Scala。

我正在寻求建议有效的方法来读取XML文件并提取包含在括号中的数据所包含的元素名称和属性。

例如

<某些名称> {property}<一些名字/>

因此,关键是 {}

中包含数据的位置

然后,我希望使用 {} 之间包含的实际元素名称和属性值填充哈希映射。

我确信这不是太复杂,但鉴于我目前在Scala的专业知识有限,我想将这个问题从论坛的专业知识中反复出来。

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

1 个答案:

答案 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树中的所有子子节点,请使用\\

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}