Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML文件,XSD架构错误:无法将名称解析为(n)“类型定义”,找不到元素的声明_Xml_Xsd - Fatal编程技术网

XML文件,XSD架构错误:无法将名称解析为(n)“类型定义”,找不到元素的声明

XML文件,XSD架构错误:无法将名称解析为(n)“类型定义”,找不到元素的声明,xml,xsd,Xml,Xsd,我不熟悉XML和XML模式。我设置了一个XML文件和一个XML模式。我对名称空间不是100%熟悉 我在XML架构中遇到以下错误: src resolve:无法将名称“childrenType”解析为“类型定义”组件。xsdsrc-resolve src resolve.4.1:解析组件“childrenType”时出错。检测到“childrenType”没有命名空间,但没有目标命名空间的组件无法从架构文档中引用file:///C:/XML/file_root.xsd'. 如果“childrenT

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

我在XML架构中遇到以下错误:

src resolve:无法将名称“childrenType”解析为“类型定义”组件。xsdsrc-resolve src resolve.4.1:解析组件“childrenType”时出错。检测到“childrenType”没有命名空间,但没有目标命名空间的组件无法从架构文档中引用file:///C:/XML/file_root.xsd'. 如果“childrenType”打算具有名称空间,则可能需要提供前缀。如果“childrenType”没有名称空间,则应将不带名称空间属性的“import”添加到“import”file:///C:/XML/file_root.xsd'.xsdsrc resolve.4.1 我在XML文件中发现以下错误:

cvc elt.1.a:找不到元素“BinaryExpressionTreeBoolean”的声明。xmlcvc elt.1.a 我不知道为什么没有定义“childrenType”,因为它是在XSD文档中进一步定义的。我怀疑这是一个名称空间问题

我试图用XSD模式表示什么:

表示树二进制表达式Treeboolean 该树只有一个根节点 树中的任何节点只能有两种类型:NodePerandType或NodeStringExpressionType 节点类型NodeOperandType是唯一可以有子节点的节点,并且要求至少有一个子节点。NodeStringExpressionType不能有任何子项。 节点类型nodePerandType具有以下元素:所需的操作数、所需的测试以及前面解释的所有子级。 节点类型NodeStringExpressionType具有以下必需元素:字符串表达式、测试、测试字符串以及测试是否区分大小写。 XSD文件:

-> -> XML文件:

或 包括 易于理解的 符合事实的 包括 易于理解的 符合事实的 接受答案后更新: 最后一个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>

由于您的编辑,您的问题是可以回答的。但仍存在一些问题:

您将元素的类型定义为xs:boolean,但内容用引号括起来,即true而不是true。这是无效的;看

您缺少所有用户定义类型的命名空间。因此,在xs:schema元素中添加一个与目标名称空间值相同的xmlns定义。所以加上

xmlns:tns="http://www.w3schools.com"
指向xs:schema元素。您需要这样才能将类型放入命名空间中

现在,将名称空间前缀tns添加到所有用户定义的类型中,以在名称空间中引用它们,即使用tns:childrenType引用childrenType类型

最后,为根类型添加根元素。所以加上

<xs:element name="BinaryExpressionTreeBoolean" type="tns:BinaryExpressionTreeBooleanType" />
在您将所有布尔字符串值从true更改为true以及从false更改为false之后,这个XSD-1.0文件可以验证上述XML。如果无法更改此选项,则有三个选项:

应用将这些值更改为有效值的预处理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>
然后在相关元素中引用此类型:

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

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

您只定义了complexTypes,还需要使用您的complexTypes定义命名元素,例如。请参阅“感谢”以获得伟大而详细的答案。但是我有一个问题,为什么要改为name=nodeperandtype。name=NodeStringExpression更改为name=NodeStringExpressionType的情况相同。在更新的XML示例中,元素分别命名为nodePerandType和NodeStringExpressionType。因此我将xs:元素命名为这样的元素。就这些,没什么了不起的。顺便说一句,元素和类型可以具有相同的名称。
<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" />