2017-12-20 3 views
1

以下は私のXMLです。私はMap[String,String]を作成したいと思います。キーはセルの最初のもので、値は2番目の値です。 Map["Active" -> "A","Cancelled"->"c"......]同じタグの要素を抽出してXMLから地図を作成

<?xml version="1.0" encoding="UTF-8" ?> 
<dvm name="Mapping" xmlns="http://xmlns.oracle.com/dvm"> 
    <description> 
    </description> 
    <columns> 
    <column name="XXXX"/> 
    <column name="YYYY"/> 
    </columns> 
    <rows> 
    <row> 
     <cell>Active</cell> 
     <cell>A</cell> 
    </row> 
    <row> 
     <cell>Cancelled</cell> 
     <cell>C</cell> 
    </row> 
    <row> 
     <cell>Suspended</cell> 
     <cell>S</cell> 
    </row> 
    <row> 
     <cell>Reserved</cell> 
     <cell>R</cell> 
    </row> 
    <row> 
     <cell>N/A</cell> 
     <cell>N</cell> 
    </row> 
    </rows> 
</dvm> 
+0

私はあなたが一枚の紙と鉛筆を得ることを示唆しています。問題を解決するために必要なステップ**を**で**書く。これらのステップを明確に理解したら、コードに変換してください。 –

+0

あなたの書式を修正してください。小規模なGoogle検索でも、スカラーやXMLを扱う際の既存のガイドをご案内します。 [この1つのように](https://alvinalexander.com/scala/xml-parsing-xpath-extract-xml-tag-attributes) – ramrunner

+0

私にはよく聞かれる質問のようですが、ちょっとした編集が必要です。 – ashawley

答えて

0
val table = 
    <dvm name="Mapping" xmlns="http://xmlns.oracle.com/dvm"> 
    <description> 
    </description> 
    <columns> 
     <column name="XXXX"/> 
     <column name="YYYY"/> 
    </columns> 
    <rows> 
     <row> 
     <cell>Active</cell> 
     <cell>A</cell> 
     </row> 
     <row> 
     <cell>Cancelled</cell> 
     <cell>C</cell> 
     </row> 
     <row> 
     <cell>Suspended</cell> 
     <cell>S</cell> 
     </row> 
     <row> 
     <cell>Reserved</cell> 
     <cell>R</cell> 
     </row> 
     <row> 
     <cell>N/A</cell> 
     <cell>N</cell> 
     </row> 
    </rows> 
    </dvm> 

val cells = for (row <- table \\ "row") yield (for (cell <- row \ "cell") yield cell.text) match { 
    case Seq(k,v) => (k,v) 
} 
cells.toMap 
+0

ありがとうございました。上記のコードは私のためにうまくいきます:) – Chandra

+0

@Chandra。おそらくあなたはそれを答えとして受け入れることを検討するでしょう。 – Phasmid

0

あなたのXMLは(あなたが本当に最初の行を望んでいないことに注意してください)、次のようなコードで定義されている場合:

val xml = //<?xml version="1.0" encoding="UTF-8" ?> 
<dvm name="Mapping" xmlns="http://xmlns.oracle.com/dvm"> 
    <description> 
... 

その後、あなたはそれを変換するために、次のコードを使用することができますマップするために:

val map = ((xml \\ "row") map { row => 
    val pair = row \ "cell" map { cell => 
     cell.text 
    } 
    pair(0) -> pair(1) 
    }).toMap 
0

をここでは、例のXMLフィルを想定し、それを行うための最も簡単な方法です。 eはdvm.xmlです。

val dvm: scala.xml.Elem = scala.xml.XML.loadFile("dvm.xml") 

val rows: Seq[Seq[String]] = { 
    for { 
    rows <- dvm \ "rows" 
    row <- rows \ "row" 
    } yield { 
    for { 
     cell <- row \ "cell" 
    } yield { 
     cell.text 
    } 
    } 
} 

val cells: Seq[(String, String)] = 
    for (Seq(k, v) <- rows) 
    yield (k -> v) 

val mappings: Map[String, String] = cells.toMap 

val a: String = mappings("Active") 
val c: String = mappings("Cancelled") 
val r: String = mappings("Reserved") 
val n: String = mappings("N/A") 

これは意図的に速く汚れています。 2つのセル要素やその他のさまざまなエラー条件が存在しないケースを処理する場合は、新しい質問を開始してそれを尋ね、使用するソースコードを提供する必要があります。ここで

は今、いくつかのより多くの例を持っているのscala-XMLのwikiです:

https://github.com/scala/scala-xml/wiki

関連する問題