2

解析してdbに保存する必要があるモデルを表すXMLドキュメントがあります。一部のフィールドでは、xsi:nilで示されるNULL値が含まれる場合があります。そのようです

<quantity xsi:nil="true"/>

解析にはscala.xmlDSLを使用します。問題は、何かがゼロであるかどうかを判断する方法が見つからないことです。これ:(elem \ "quantity")は空の文字列を返すだけで、数値に変換しようとすると爆発します。また、それをOptionでラップしても役に立ちません。

そのXML部分からNone、Nil、さらにはnullを取得する方法はありますか?

4

2 に答える 2

3

この場合、XML withattributeメソッドで名前空間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)

空のノードがNoneであると考える場合は、属性を気にする必要はありません。テキストを含まないノードを除外し、を使用headOptionして値を取得するだけです。

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
于 2012-12-17T02:02:37.807 に答える
3

xtractを使用する場合は、フィルターとオプションを組み合わせてこれを行うことができます。

(__ \ "quantity").read[Node]
  .filter(_.attribute("http://www.w3.org/2001/XMLSchema-instance", "nil").isEmpty)
  .map(_.toDouble).optional

https://www.lucidchart.com/techblog/2016/07/12/introducing-xtract-a-new-xml-deserialization-library-for-scala/を参照してください

免責事項:私はLucid Softwareで働いており、xtractの寄稿者です。

于 2016-07-12T18:05:32.867 に答える