2012-12-17 6 views
2

DB에서 구문 분석하고 저장해야하는 모델을 나타내는 XML 문서가 있습니다. 일부 필드에서는 xsi : nil로 표시된 NULL 값을 가질 수 있습니다. 좋아요.스칼라 XML 구문 분석에서 nil을 처리하는 방법은 무엇입니까?

<quantity xsi:nil="true"/> 

저는 구문 분석을 위해 scala.xml DSL을 사용합니다. 문제는 무언가가 무효인지 아닌지를 판단 할 수있는 방법을 찾을 수 없다는 것입니다. 이것은 : (elem \ "수량") 그냥 숫자로 변환하려고하면 불어 난 빈 문자열을 반환합니다. 또한 Option을 사용하여 래핑하면 도움이되지 않습니다.

해당 XML 조각에서 없음, Nil 또는 null을 얻을 수있는 방법이 있습니까?

답변

3

이 경우 XML과 함께 attribute 메서드가있는 네임 스페이스 URI를 사용하여 "xsi : nil"특성의 텍스트를 가져올 수 있습니다. 당신이 빈 노드가 없음입니다 고려할 경우, 당신도 속성을 귀찮게 할 필요가 없습니다,

scala> val xml = <quantity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
xml: scala.xml.Elem = <quantity xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></quantity> 

scala> xml.attribute("http://www.w3.org/2001/XMLSchema-instance", "nil") 
res0: Option[Seq[scala.xml.Node]] = Some(true) 

: 여기

은 작업 예입니다. 그 안에 텍스트가없는 노드를 필터링하고 headOption을 사용하여 값을 가져옵니다. 당신이 xtract를 사용하는 경우

scala> val s1 = <quantity xsi:nil="true">12</quantity> 
s1: scala.xml.Elem = <quantity xsi:nil="true">12</quantity> 

scala> val s2 = <quantity xsi:nil="true"/> 
s2: scala.xml.Elem = <quantity xsi:nil="true"></quantity> 

scala> s1.filterNot(_.text.isEmpty).headOption.map(_.text.toInt) 
res10: Option[Int] = Some(12) 

scala> s2.filterNot(_.text.isEmpty).headOption.map(_.text.toInt) 
res11: Option[Int] = None 
+0

감사합니다. 아마도 scala.xml이 nils를 처리하지만 분명히 처리하지 않기를 바랬습니다. – Lubiluk