2017-12-20 10 views
1

다음은 XML입니다. 키가 셀의 첫 번째 값이고 값이 두 번째 값인 Map[String,String]을 만들고 싶습니다. 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

내가 제안 : 여기

지금, 몇 가지 더 많은 예제를 가지고 스칼라 - XML ​​위키입니다. 문제를 해결하기 위해 취해야 할 조치 **를 **로 ** 작성하십시오. 이러한 단계를 명확하게 이해하고 나면 코드로 변환하십시오. –

+0

서식을 수정하십시오. 또한 작은 구글 검색은 scala와 XML 작업에 관한 기존 가이드를 알려줄 것입니다. [이 하나처럼] (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의 FIL 가정 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") 

이것은 의도적으로 빠르고 더러워졌습니다. 셀 요소가 두 개나 기타 다양한 오류 조건이없는 경우를 처리하려면 새 질문을 시작하고 질문을하고 사용하는 소스 코드를 제공해야합니다. 당신은 종이와 연필을 얻을

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