我是XML和XML Schema的新手。我设置了一个XML文件和一个XML模式。我不是100%熟悉名称空间。
我在XML模式中遇到以下错误:
我在XML文件中遇到以下错误:
我不知道为什么未定义'childrenType',因为它在XSD文档中进一步定义。我怀疑这是一个名称空间问题。
我要用XSD模式表示的内容:
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>
答案 0 :(得分:1)
自您进行修改以来,您的问题已得到解答。但是仍然存在一些问题:
您将<case_sensitive>
元素的类型定义为xs:boolean
,但是您的内容用引号引起来,即"true"
而不是true
。这是无效的;参见this SO answer regarding boolean values in XSD。
您缺少所有用户定义类型的名称空间。因此,将与目标名称空间相同的xmlns
定义添加到xs:schema
元素中。因此添加
xmlns:tns="http://www.w3schools.com"
到xs:schema
元素。您需要这样做才能将类型放入命名空间。
现在将名称空间前缀tns
添加到所有用户定义的类型中,以在名称空间中引用它们,即用childrenType
引用类型tns:childrenType
。
最后,为您的根类型添加一个根元素。因此添加
<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。如果您无法更改此设置,则可以使用以下三个选项:
应用将这些值更改为有效值的预处理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(.,'"','')" />
</xsl:template>
</xsl:stylesheet>
将元素<case_sensitive>
的类型更改为xs:string
。
以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" />
完成所有这些操作后,验证将成功。