读取和写入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>