XML / XSD - 如何递归地引用Itself中的complexType?

时间:2011-12-07 21:40:13

标签: xml recursion reference xsd

我的问题与What xsd will let an element have itself as a sub element infinitely?非常相似。

我想要做的是利用能够在XML中创建Skeleton的XML结构。 XML将有一个顶级complexType,其中包含一个包含自己的属性和元素数据的Bone complexTypes的递归列表。

我正在使用的XML在这里:

<SkeletalMapping xmlns="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test SkeletalDefinition.xsd">

<Skeleton sourceSkeleton="Max" targetSkeleton="UDK" version="1.0">
    <Bone name="Origin" target="ROOT">
        <PivotPoint x="0.0" y="0.0" z="0.0" />
        <Bone name="UpperBody" target="SPINE">
            <PivotPoint x="0.0" y="0.033" z="0.438" />
            <Bone name="Head" target="HEAD">
                <PivotPoint x="0.0" y="0.006" z="0.667" />
            </Bone>
            <Bone name="RightArm" target="RIGHT_ARM">
                <PivotPoint x="-0.203" y="0.05" z="0.477" />
                <Bone name="LRightHand" target="RIGHT_HAND">
                    <PivotPoint x="-0.586" y="0.074" z="0.067" />
                </Bone> <!-- LeftHand -->
            </Bone> <!-- LeftArm -->
            <Bone name="LeftArm" target="LEFT_ARM">
                <PivotPoint x="0.203" y="0.05" z="0.477" />
                <Bone name="LeftHand" target="LEFT_HAND">
                    <PivotPoint x="0.587" y="0.074" z="0.066" />
                </Bone> <!-- LeftHand -->
            </Bone> <!-- LeftArm -->
        </Bone> <!-- UpperBody -->
        <Bone name="RightLeg" target="RIGHT_LEG">
            <PivotPoint x="-0.14" y="-0.019" z="-0.467" />
            <Bone name="RightFoot" target="RIGHT_FOOT">
                <PivotPoint x="-0.17" y="0.083" z="-0.889" />
            </Bone> <!-- RightFoot -->
        </Bone> <!-- RightLeg -->
        <Bone name="LeftLeg" target="LEFT_LEG">
            <PivotPoint x="0.14" y="-0.019" z="-0.467" />
            <Bone name="LeftFoot" target="LEFT_FOOT">
                <PivotPoint x="0.17" y="0.083" z="-0.889" />
            </Bone> <!-- LegFoot -->
        </Bone> <!-- LeftLeg -->
    </Bone> <!-- Origin -->
</Skeleton>

我正在使用的XSD是:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="Vec3">
        <xs:attribute name="x" type="xs:float"/>
        <xs:attribute name="y" type="xs:float"/>
        <xs:attribute name="z" type="xs:float"/>
    </xs:complexType>

    <xs:element name="Bone">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element ref="Bone" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:element name="PivotPoint" type="Vec3" minOccurs="0" maxOccurs="1"/>
            <xs:attribute name="name" type="xsd:string" use="required"/>
            <xs:attribute name="target" type="xsd:string" />
        </xs:complexType>
    </xs:element>

    <xs:element name="Skeleton">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Bone" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="sourceSkeleton" type="xs:string" />
            <xs:attribute name="targetSkeleton" type="xs:string" />
            <xs:attribute name="version" type="xs:string" />
        </xs:complexType>
    </xs:element>

    <xs:element name="SkeletonMapping">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Skeleton"/>
            </xs:sequence>
        </xs:complexType>
</xs:element>
</xs:schema>

我使用的编辑器是带有XML插件的Notepad ++。 XML和XSD语法通过了验证,但我无法弄清楚为什么XSD的XML Tool验证说它无法解析XML。

如果有人知道如何解决这个问题,请告诉我,因为我试图打破骨传承:

<Skeleton>
    <Bone>
        <Bone>
            <Bone/>
        </Bone>
    </Bone>
</Skeleton>

<Skeleton>
    <BoneGroup>
        <Bone>
            <BoneGroup>
                <Bone>
                    <BoneGroup>
                        <Bone/>
                    </BoneGroup>
                </Bone>
            </BoneGroup>
        </Bone>
    </BoneGroup>
</Skeleton>

,为此我创建了一个新元素BoneGroup,其中有一个引用了Bone的引用,而Bone有一个引用了BoneGroup的引用,但是没有更好的效果。

1 个答案:

答案 0 :(得分:1)

您的XML架构文件无效。首先,对于这两个属性,使用xs:更改xsd:别名,因为xs:是您为XSD名称空间指定的别名。然后使用PivotPoint并按照它现在的顺序放置第一个项目。

然后,您必须使用XSD或XML来同意顶级元素名称应该是什么:SkeletalMapping或SkeletonMapping。

然后你需要修复XML命名空间;您的XSD没有目标命名空间,而您的XML将默认命名空间定义为“test”;因此,您要么将XSD文件中的targetNamespace和default命名空间添加为“test”,要么删除XML文件中的xmlns =“test”;如果你选择后者,请确保你也将xsi:schemaLocation更改为xsi:noNamespaceSchemaLocation。

我不希望通过重新发布更正的文件来臃肿响应;如果你还有麻烦,请告诉我,我会附上一个带有压缩文件的链接。我测试了经过纠正的测试,并且使用我的工具可以正常工作。