如何找出xsd文件中所有可能的元素层次结构?

问题描述 投票:0回答:1

我正在使用一些特定于域的 GML 文件,这些文件实际上是能够存储 GIS 域中空间特征的几何形状的 XML 文件。

我有这两个 xsd 文件,描述了国际海道测量组织 (IHO) 的数据模型,S100 数据模型:

https://schemas.s100dev.net/schemas/S100/5.0.0/S100GML/20220620/S100_gmlProfile.xsd

https://schemas.s100dev.net/schemas/S100/5.0.0/S100GML/20220620/s100gmlbase.xsd

在这些文件中,有时由扩展和序列标签定义的可能的子标签是从复杂类型或抽象类继承的。

我想找到一种只显示元素层次结构的树形模型。例如,我希望看到 tag1 可以将 tag2 和 tag3 作为子项,然后标签 2 可以有 ...

我的意思是我想将所有继承应用于可能的子对象,并且还一直应用到元素对象的属性。

然后,我想要一个图表或树来显示从根到最后一个元素的所有可能的方式。

我可以获得企业架构师 (EA) 许可证。我想知道使用或不使用 EA 创建该图表或树的最佳方法是什么。

与我们在此示例中看到的类似:

https://sparxsystems.com/enterprise_architect_user_guide/16.1/modeling_domains/abstract_xsd_models.html

从 xsd 到仅元素层次结构,但应用所有继承。

我在 EA 中导入了 xsd 文件,它看起来像这样:

在此输入图片描述

显示所有抽象类和枚举以及所有内容。

我只想查看元素,但应用了所有继承。

我也尝试过一些在线工具,例如: https://myxml.in/xsd-treeview.html

但它也显示抽象类和类型以及所有内容。

这是有效的 S100 Geometry 标签的有效层次结构示例:

<geometry>
    <s100:surfaceProperty xlink:href="#s94">
        <s100:Surface srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="s94">
            <gml:patches>
                <gml:PolygonPatch>
                    <gml:exterior>
                        <gml:Ring>
                            <gml:curveMember xlink:href="#cc142">
                                <s100:CompositeCurve    srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="cc142">
                                    <gml:curveMember xlink:href="#oc222">
                                        <s100:OrientableCurve srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="oc222" orientation="+">
                                            <gml:baseCurve xlink:href="#c212">
                                                <s100:Curve srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="c212">
                                                    <gml:segments>
                                                        <gml:LineStringSegment>
                                                            <gml:posList></gml:posList>
                                                        </gml:LineStringSegment>
                                                    </gml:segments>
                                                </s100:Curve>
                                            </gml:baseCurve>
                                        </s100:OrientableCurve>
                                    </gml:curveMember>
                                </s100:CompositeCurve>
                            </gml:curveMember>
                        </gml:Ring>
                    </gml:exterior>
                    <gml:interior>
                        <gml:Ring>
                            <gml:curveMember xlink:href="#cc143">
                                <s100:CompositeCurve srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="cc143">
                                    <gml:curveMember xlink:href="#oc223">
                                        <s100:OrientableCurve srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="oc223" orientation="-">
                                            <gml:baseCurve xlink:href="#c213">
                                                <s100:Curve srsName="http://www.opengis.net/def/crs/EPSG/0/4326" gml:id="c213">
                                                    <gml:segments>
                                                        <gml:LineStringSegment>
                                                            <gml:posList></gml:posList>
                                                        </gml:LineStringSegment>
                                                    </gml:segments>
                                                </s100:Curve>
                                            </gml:baseCurve>
                                        </s100:OrientableCurve>
                                    </gml:curveMember>
                                </s100:CompositeCurve>
                            </gml:curveMember>
                        </gml:Ring>
                    </gml:interior>
                </gml:PolygonPatch>
            </gml:patches>
        </s100:Surface>
    </s100:surfaceProperty>
</geometry>

In order to read them, I need to know the possible hierarchies. That is why I need to create a tree from it. or somehow find all hierarchies.


xml xsd gis gml
1个回答
0
投票

这是一个艰巨的挑战。您没有提到一些问题:可以有通配符、替换组以及通过扩展派生的类型,当然复杂类型可以是递归的。这还没有考虑

xs:redefine

您可能最好尝试找到一个模式处理器,该处理器提供可访问已编译模式模型的 API。 Saxon [我公司的产品] 允许您深入提取此类信息,尽管它不是一个记录良好的公共 API。但例如,从

Configuration
对象中,您可以找到一个复杂类型(类
UserComplexType
),并且该类有一个方法
gatherAllPermittedChildren
,它允许您确定可以出现在内容模型中的所有元素的名称 - 使用关于通配符的注意事项。

这有点粗糙,因为这些元素可能是全局或本地声明的,因此知道元素名称不足以确定元素的类型及其允许的子元素。理想情况下,您可以从复杂类型转到其粒子,再从粒子转到元素声明,这将为您提供子级的类型。

作为使用 Java API 的替代方案,Saxon 还允许您生成 SCM 文件,该文件是架构组件模型的 XML 表示形式,然后您可以使用 XSLT 或 XQuery 进行处理。

我不了解Enterprise Architect 产品。

我相信 Xerces 也有某种 API 可以访问模式结构,但我不熟悉细节。

© www.soinside.com 2019 - 2024. All rights reserved.