<any>,再び
<any>
のラウンド・トリップにおいて貨物を無くさないために,DataRecord
中に scala.xml.Elem
を保存してきましたが,DataRecord
を利用する側に立つと,これは不便でもあります.問題は <any>
はどの要素が来てもいいためパース不可能なことです.ただし,組み込み型はパース可能です.
混在内容のカタがある程度ついたので,XSD 組み込み型のパースに手をつけるいい機会だと思いました.使用例は以下のようになります:
def testAny { val subject = <foo xmlns="http://www.example.com/any" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <int xsi:type="xs:int">1</int> <byte xsi:type="xs:byte">1</byte> <dateTime xsi:type="xs:dateTime">2002-10-10T12:00:00Z</dateTime> </foo> val obj = Element1.fromXML(subject) obj match { case Element1( DataRecord(Some("http://www.example.com/any"), Some("int"), 1), DataRecord(Some("http://www.example.com/any"), Some("byte"), 1), DataRecord(Some("http://www.example.com/any"), Some("dateTime"), XMLCalendar("2002-10-10T12:00:00Z")) ) => case _ => error("match failed: " + obj.toString) } val document = Element1.toXML(obj, None, Some("foo"), subject.scope) println(document) }
DataRecord
は Int
,Byte
,javax.xml.datatype.XMLGregorianCalendar
,など組み込み型に対応した適当な型を格納します.DataRecord
はまた内部的に {http://www.w3.org/2001/XMLSchema-instance}type
属性付きでラウンド・トリップする方法を記憶しています.