2017-12-20 3 views
1

Unten ist mein XML zu extrahieren. Ich möchte eine Map[String,String] mit Schlüssel erstellen ist zuerst in Zelle und Wert ist zweiter Wert, z. Map["Active" -> "A","Cancelled"->"c"......]erstellen Karte von XML durch Elemente mit gleichem Tag

<?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

Ich schlage vor, dass Sie ein Stück Papier und einen Bleistift zu bekommen. Schreiben Sie ** in Worten ** die Schritte, die Sie ergreifen müssen, um das Problem zu lösen. Nachdem Sie diese Schritte verstanden haben, übersetzen Sie sie in Code. –

+0

Bitte korrigieren Sie Ihre Formatierung. Auch eine kleine Google-Suche würde Sie auf vorhandene Anleitungen zum Arbeiten mit Scala und XML verweisen. [wie diese] (https://alvinalexander.com/scala/xml-parsing-xpath-extract-xml-tag-attributes) – ramrunner

+0

Sieht aus wie eine gut gestellte Frage zu mir, nur ein wenig Bearbeitung benötigt. – ashawley

Antwort

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

Vielen Dank. Der obige Code funktioniert gut für mich :) – Chandra

+0

@Chandra Gut. Vielleicht würdest du es als Antwort akzeptieren. – Phasmid

0

Wenn Ihr xml in Code wie folgt definiert ist (bitte beachten Sie, dass Sie wirklich nicht die erste Zeile wollen):

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

dann können Sie das folgende Snippet verwenden, um es zu konvertieren zur Karte:

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

Hier ist der einfachste Weg, es zu tun, das Beispiel XML fil unter der Annahme, e ist 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") 

Dies ist absichtlich schnell und schmutzig. Wenn Sie Fälle behandeln möchten, in denen nicht zwei Zellenelemente oder andere verschiedene Fehlerbedingungen vorliegen, sollten Sie eine neue Frage starten und diese fragen und den von Ihnen verwendeten Quellcode angeben. Hier

ist das scala-xml Wiki, die einige weitere Beispiele hat, jetzt:

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

Verwandte Themen