XML-файл, схема XSD. Ошибки: невозможно преобразовать имя в (n) «определение типа», не удается найти объявление элемента. - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в XML и XML Schema.Я настроил файл XML и схему XML.Я не на 100% знаком с пространствами имен.

Я получаю следующие ошибки в схеме XML:

  • src-resol: Не удается разрешить имя 'childrenType' в a (n)'определение типа' component.xsd (src-resol)
  • src-resol.4.1: Ошибка при разрешении компонента 'childrenType'.Было обнаружено, что у 'childrenType' нет пространства имен, но компоненты без целевого пространства имен не доступны из файла схемы документа 'file: /// C: /XML/file_root.xsd'.Если 'childrenType' должен иметь пространство имен, возможно, необходимо указать префикс.Если предполагается, что у «childrenType» нет пространства имен, то «file» без атрибута «namespace» следует добавить в «file: /// C: /XML/file_root.xsd'.xsd (src-resol.4.1»).)

В XML-файле появляются следующие ошибки:

  • cvc-elt.1.a: не удается найти объявление элемента 'BinaryExpressionTreeBoolean'.xml (cvc-elt.1.a)

Я не знаю, почему не определено значение childrenType, поскольку оно определено ниже в документе XSD.Я подозреваю, что это проблема пространства имен.

То, что я пытаюсь представить в схеме XSD:

  • Представление дерева (BinaryExpressionTreeBoolean)
  • Дерево имеетодин и только один корневой узел
  • Любой узел в дереве может быть только двух типов (NodeOperandType или NodeStringExpressionType)
  • Тип узла, NodeOperandType, является единственным узлом, который может иметь детей, и онтребуется иметь хотя бы одного ребенка.NodeStringExpressionType не может иметь дочерних элементов.
  • Тип узла NodeOperandType имеет следующие элементы: операнд (обязательный), тест (обязательный) и любые дочерние элементы (как описано ранее).
  • Тип узла NodeStringExpressionTypeимеет следующие обязательные элементы: строковое выражение, тест, тестовую строку и то, является ли тест чувствительным к регистру.

XSD-файл:

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">
    <xs:complexType name="NodeOperandType">
        <xs:sequence>
            <!-- <xs:element name="operand" type="xs:string" /> -->
            <xs:element name="test" type="xs:string" />
            <xs:element name="children" type="childrenType" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="NodeStringExpressionType">
        <xs:sequence>
            <!-- <xs:element name="string_expression" type="xs:string" /> -->
            <xs:element name="test" type="xs:string" />
            <xs:element name="test_string" type="xs:string" />
            <xs:element name="case_sensitive" type="xs:boolean" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="NodeType">
        <xs:choice>
            <xs:element name="NodeOperand" type="NodeOperandType" minOccurs="1" maxOccurs="1" />
            <xs:element name="NodeStringExpression" type="NodeStringExpressionType" minOccurs="1" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="childrenType">
        <xs:sequence>
            <xs:element name="Node" type="NodeType" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BinaryExpressionTreeBoolean">
        <xs:sequence>
            <xs:element name="Node" type="NodeType" minOccurs="1"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

XML-файл:

<?xml version="1.0" ?>
<BinaryExpressionTreeBoolean xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.w3schools.com file:///C:/XML/file_root.xsd">
    <Node>
        <NodeOperandType>
            <test>"or"</test>
            <children>
                <Node>
                    <NodeStringExpressionType>
                        <test>"include"</test>
                        <test_string>"simple"</test_string>
                        <case_sensitive>"true"</case_sensitive>
                    </NodeStringExpressionType>
                </Node>
                <Node>
                    <NodeStringExpressionType>
                        <test>"include"</test>
                        <test_string>"simple"</test_string>
                        <case_sensitive>"true"</case_sensitive>
                    </NodeStringExpressionType>
                </Node>
            </children>
        </NodeOperandType>
    </Node>
</BinaryExpressionTreeBoolean>

Обновление после принятого ответа:

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

<?xml version="1.0" ?>
<BinaryExpressionTreeBoolean xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com file:///C:/XML/file_root.xsd">
    <Node>
        <NodeOperand>
            <test>"or"</test>
            <children>
                <Node>
                    <NodeStringExpression>
                        <test>"include"</test>
                        <test_string>"simple"</test_string>
                        <case_sensitive>true</case_sensitive>
                    </NodeStringExpression>
                </Node>
                <Node>
                    <NodeStringExpression>
                        <test>"include"</test>
                        <test_string>"simple"</test_string>
                        <case_sensitive>true</case_sensitive>
                    </NodeStringExpression>
                </Node>
            </children>
        </NodeOperand>
    </Node>
</BinaryExpressionTreeBoolean>

1 Ответ

1 голос
/ 23 июня 2019

С момента вашего редактирования ваш вопрос отвечает.Но остаются некоторые проблемы:

  1. Вы определяете тип элемента <case_sensitive> как xs:boolean, но ваш контент заключен в кавычки, то есть "true" вместо true.Это недействительно;см. этот SO-ответ относительно логических значений в XSD .

  2. Вам не хватает пространства имен всех ваших пользовательских типов.Поэтому добавьте определение xmlns с тем же значением, что и целевое пространство имен, к элементу xs:schema.Поэтому добавьте

    xmlns:tns="http://www.w3schools.com"
    

    к элементу xs:schema.Это необходимо для помещения типов в пространство имен.

  3. Теперь добавьте префикс пространства имен tns, чтобы все ваши пользовательские типы ссылались на них в пространстве имен, т.е.введите childrenType с tns:childrenType.

  4. Наконец, добавьте корневой элемент для вашего корневого типа.Поэтому добавьте

    <xs:element name="BinaryExpressionTreeBoolean" type="tns:BinaryExpressionTreeBooleanType" />
    

    в файл XSD, который требует, чтобы вы изменили имя вашего xs:complexType с BinaryExpressionTreeBoolean на BinaryExpressionTreeBooleanType.

Объединениевсе эти изменения, ваш XSD может выглядеть следующим образом:

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified" xmlns:tns="http://www.w3schools.com">

    <xs:complexType name="NodeOperandType">
        <xs:sequence>
            <!-- <xs:element name="operand" type="xs:string" /> -->
            <xs:element name="test" type="xs:string" />
            <xs:element name="children" type="tns:childrenType" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="NodeStringExpressionType">
        <xs:sequence>
            <!-- <xs:element name="string_expression" type="xs:string" /> -->
            <xs:element name="test" type="xs:string" />
            <xs:element name="test_string" type="xs:string" />
            <xs:element name="case_sensitive" type="xs:boolean" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="NodeType">
        <xs:sequence>
            <xs:choice>
                <xs:element name="NodeOperandType" type="tns:NodeOperandType" minOccurs="1" maxOccurs="1" />
                <xs:element name="NodeStringExpressionType" type="tns:NodeStringExpressionType" minOccurs="1" maxOccurs="unbounded" />
            </xs:choice>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="childrenType">
        <xs:sequence>
            <xs:element name="Node" type="tns:NodeType" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="BinaryExpressionTreeBooleanType">
        <xs:sequence>
            <xs:element name="Node" type="tns:NodeType" minOccurs="1"></xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="BinaryExpressionTreeBoolean" type="tns:BinaryExpressionTreeBooleanType" />
</xs:schema>

И этот файл XSD-1.0 может проверять ваш вышеуказанный XML после того, как вы изменили все свои логические строковые значения с "true" на true иот "false" до false.Если вы не можете изменить это, у вас есть три варианта:

  1. Применить файл предварительной обработки XSLT, который изменяет эти значения на допустимые.Это может быть достигнуто, например, с помощью следующего шаблона:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.w3schools.com" version="1.0">
        <xsl:output indent="yes"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="tns:case_sensitive/text()">
            <xsl:value-of select="translate(.,'&quot;','')" />
        </xsl:template>
    
    </xsl:stylesheet>
    
  2. Измените тип элемента <case_sensitive> на xs:string.

  3. Выразите тип в xs:pattern.Для этого добавьте следующий тип:

    <xs:simpleType name="caseType">
        <xs:restriction base="xs:string">
            <xs:pattern value='true|false|\"true\"|\"false\"|1|0'></xs:pattern> 
        </xs:restriction>
    </xs:simpleType>
    

    , а затем укажите этот тип в связанном элементе:

    <xs:element name="case_sensitive" type="tns:caseType" />
    

После всего этого проверка пройдёт успешно .

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