读取和写入VO模型注释(MIDOT)#
A RESOURCE
元件可以是 MIVOT
自VOTable版本1.5以来就被阻止。
介绍#
VOTables中的模型实例 (MIVOT )定义了将可投票数据映射到以VO-DML(虚拟观察站数据建模语言)序列化的任何模型的语法。该注释模式充当数据和模型之间的桥梁。它将列/参数元数据和投票表中的数据与数据模型元素(类、属性、类型等)相关联。它还调出表中可能缺失的可投票数据或元数据,例如坐标系描述或管理跟踪。数据模型元素被分组到符合MIVOT XML模式的独立注释块中,该注释块作为额外资源添加到表元素之上。MIVOT语法允许将数据结构描述为类的层次结构。它还能够表示它们之间的关系和组成。此外,它还可以通过聚合来自投票表的不同表的实例来构建数据模型对象。
Astroy实现#
Astropy的目的不是处理VO注释。它只是允许相关的包从VOTables获取MIVOT块并将其设置到VOTables。因此,在此实现中,MIVOT注释既作为字符串导入,也作为字符串导出。当前实现防止客户端代码注入非MIVOT序列化的VOTables字符串。
MivotBlock实施:
MIVOT块由
astropy.io.votable.tree.MivotBlock
班级。MivotBlock实例只能由带有“type=meta”的资源承载。
此实例将XML映射块作为字符串保存。
MivotBlock对象由资源解析器实例化。
MivotBlock类有自己的逻辑,可以同时操作解析和IO功能。
例子#
<VOTABLE xmlns="http://www.ivoa.net/xml/VOTable/v1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.3">
<RESOURCE>
<RESOURCE type="meta">
<VODML xmlns="http://www.ivoa.net/xml/mivot">
...
</VODML>
</RESOURCE>
<TABLE name="myDataTable">
....
</TABLE>
</RESOURCE>
</VOTABLE>
读取包含MIVOT块的表格表#
要读入包含或不包含MIVOT资源的VOTABLE文件,请将文件路径传递到`~ASTOSTPY.io.voable.parse`:
>>> from astropy.io.votable import parse
>>> from astropy.utils.data import get_pkg_data_filename
>>> votable = parse(get_pkg_data_filename("data/test.order.xml", package="astropy.io.votable.tests"))
<VODML xmlns="http://www.ivoa.net/xml/mivot">
</VODML>
<VODML xmlns="http://www.ivoa.net/xml/mivot">
</VODML>
如果Parse函数检测到MIVOT块,它将调用MIVOT解析器。
构建包含MIVOT块的资源#
通过将XML块作为参数传递来构造MIVOT块:
>>> from astropy.io.votable import tree
>>> from astropy.io.votable.tree import MivotBlock, Resource, VOTableFile
>>> mivot_block = MivotBlock("""
<VODML xmlns="http://www.ivoa.net/xml/mivot" >
<REPORT status="OK">Unit test mapping block</REPORT>
<GLOBALS> </GLOBALS>
</VODML>
""")
构建新资源:
>>> mivot_resource = Resource()
将其类型指定为META:
>>> mivot_resource.type = "meta"
然后将其添加到MIVOT块:
>>> mivot_resource.mivot_block = mivot_block
现在,您有了一个MIVOT资源,您可以将其添加到创建新资源的对象资源中:
>>> votable = VOTableFile()
>>> r1 = Resource()
>>> r1.type = "results"
>>> r1.resources.append(mivot_resource)
您可以添加一个 astropy.io.votable.tree.TableElement
至资源:
>>> table = tree.TableElement(votable)
>>> r1.tables.append(t1)
>>> votable.resources.append(r1)
>>> for resource in votable.resources:
... print(resource.mivot_block.content)
<VODML xmlns="http://www.ivoa.net/xml/mivot" >
<REPORT status="OK">Unit test mapping block</REPORT>
<GLOBALS> </GLOBALS>
</VODML>