我的问题与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的引用,但是没有更好的效果。
答案 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。
我不希望通过重新发布更正的文件来臃肿响应;如果你还有麻烦,请告诉我,我会附上一个带有压缩文件的链接。我测试了经过纠正的测试,并且使用我的工具可以正常工作。