XML文件,XSD模式错误:无法将名称解析为(类型)类型,找不到元素的声明

时间:2019-06-23 17:02:00

标签: xml xsd

我是XML和XML Schema的新手。我设置了一个XML文件和一个XML模式。我不是100%熟悉名称空间。

我在XML模式中遇到以下错误:

  • src-resolve:无法将名称'childrenType'解析为(n)'type definition'组件。xsd(src-resolve)
  • src-resolve.4.1:解决组件'childrenType'时出错。检测到'childrenType'没有名称空间,但是没有目标名称空间的组件无法从架构文档'file:/// C:/XML/file_root.xsd'中引用。如果“ childrenType”打算具有名称空间,则可能需要提供前缀。如果打算让'childrenType'没有命名空间,则应将没有“ namespace”属性的'import'添加到'file:/// C:/XML/file_root.xsd'.xsd(src-resolve.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 个答案:

答案 0 :(得分:1)

自您进行修改以来,您的问题已得到解答。但是仍然存在一些问题:

  1. 您将<case_sensitive>元素的类型定义为xs:boolean,但是您的内容用引号引起来,即"true"而不是true。这是无效的;参见this SO answer regarding boolean values in 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>

在您将所有布尔值从"true"更改为true以及从"false"更改为false之后,此XSD-1.0文件可以验证您的上述XML。如果您无法更改此设置,则可以使用以下三个选项:

  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" />
    

完成所有这些操作后,验证将成功