XML / XSD - Как мне рекурсивно ссылаться на complexType внутри себя? - PullRequest
2 голосов
/ 08 декабря 2011

Мой вопрос очень похож на Что xsd позволит элементу бесконечно иметь себя как подэлемент? .

Что я хочу сделать, это использовать структуру XML, которая способнасоздать скелет в XML.XML будет иметь сложный тип верхнего уровня, который включает в себя рекурсивный список сложных типов кости, который включает их собственные атрибуты и данные элемента.

Я использую 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>

Редактор, который я использую, это Notepad ++ с плагинами XML.Синтаксис XML и XSD проходит проверку, однако я не могу понять, почему проверка XSD с помощью инструмента XML не позволяет анализировать XML.

Если кто-то знает, как я могу это исправить, пожалуйста, дайте мне знатькак я пытался разорвать наследство Bone от:

<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 Ответ

1 голос
/ 08 декабря 2011

Файл XML-схемы недействителен.Во-первых, измените xsd: alias на xs: для этих двух атрибутов, поскольку xs: это псевдоним, назначенный для пространства имен XSD.Затем возьмите PivotPoint и поместите его первым элементом в той последовательности, в которой он находится сейчас.

Затем вам нужно поработать либо с XSD, либо с XML, чтобы договориться о том, каким должно быть имя верхнего элемента: SkeletalMapping или SkeletonMapping.

Затем вам нужно исправить пространство имен XML;ваш XSD не имеет целевого пространства имен, тогда как ваш XML определяет пространство имен по умолчанию как «тест»;таким образом, вы либо добавляете targetNamespace и пространство имен по умолчанию в свой XSD-файл в качестве «test», либо удаляете xmlns = «test» в своем XML-файле;если вы используете последний вариант, убедитесь, что вы также изменили xsi: schemaLocation на xsi: noNamespaceSchemaLocation.

Я не хочу раздувать ответ, отправляя повторно исправленные файлы;если у вас все еще есть проблемы, пожалуйста, дайте мне знать, и я приложу ссылку с заархивированными файлами.Я проверил исправленные, и они отлично работают с моим инструментом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...