2011-07-21 172 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