我正在尝试制作一个XML Schema来首次验证我的XML。
开始使用我的XML(注意“-instance
”和“SectionNumber="0"
”):
<?xml version="1.0" encoding="utf-8"?>
<CrystalReport
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:crystal-reports:schemas:report-detail
http://www.businessobjects.com/products/xml/CR2008Schema.xsd"
xmlns="urn:crystal-reports:schemas:report-detail"
>
<ReportHeader>
<Section SectionNumber="0">
<Text Name="Text9">
...
我的XML架构(注意第2,3和20行):
<?xml version="1.0" encoding="utf-8"?>
<xsi:schema id="XMLSchema_varslings1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:crystal-reports:schemas:report-detail"
elementFormDefault="qualified"
targetNamespace="urn:crystal-reports:schemas:report-detail">
<xsi:element name="CrystalReport" type="CrystalReportType"/>
<xsi:complexType name="CrystalReportType">
<xsi:sequence maxOccurs="unbounded">
<xsi:element name="ReportHeader" type="ReportHeaderType"/>
</xsi:sequence>
</xsi:complexType>
<xsi:complexType name="ReportHeaderType">
<xsi:sequence>
<xsi:element name="Section" type="SectionType"/>
<!-- This is line 19....................................... -->
<xsi:attribute name="SectionNumber" type="xsi:Integer"/>
</xsi:sequence>
</xsi:complexType>
<xsi:complexType name="SectionType">
<xsi:sequence maxOccurs="unbounded">
<xsi:element name="Text" type="TextType" />
</xsi:sequence>
</xsi:complexType>
<xsi:complexType name="TextType">
<xsi:sequence maxOccurs="unbounded">
<xsi:element name="TextValue" type="xsi:string" />
</xsi:sequence>
</xsi:complexType>
</xsi:schema>
我收到此错误,我无法解决:
“The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'.
”
如果我从架构中删除“-instance
”,我摆脱了上述错误,但我无法使用属性“<xsi:attribute name="SectionNumber" type="xsi:Integer"/>
”的代码。
我甚至不知道我的真正问题是-instance
部分还是有另一种方法可以在模式中编写/包含属性。我该如何解决这个问题?
答案 0 :(得分:1)
您混淆了两个名称空间:XMLSchema
和XMLSchema-instance
。这两个用途不同,XMLSchema
(通常带有前缀xs
)用于声明您的架构。这就是为什么你的XSD文件没有它就无法工作的原因。
如果要在文档中使用某些XML架构,则使用命名空间XMLSchema-instance
(通常带有前缀xsi
)。例如,schemaLocation
前缀位于此命名空间中。
类型integer
(小写i
)位于XMLSchema
命名空间中,因此您必须使用它。
此外,您的元素顺序不正确。 <xs:attribute>
应该在<xs:sequence>
之后。
因此,您的架构应如下所示:
<xs:schema id="XMLSchema_varslings1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:crystal-reports:schemas:report-detail"
elementFormDefault="qualified"
targetNamespace="urn:crystal-reports:schemas:report-detail">
…
<xs:complexType name="ReportHeaderType">
<xs:sequence>
<xs:element name="Section" type="SectionType"/>
</xs:sequence>
<xs:attribute name="SectionNumber" type="xs:integer"/>
</xs:complexType>
</xs:schema>
我还将名称空间前缀更改为xs
,因为它有意义,但从技术上讲,它不是必需的。
答案 1 :(得分:0)
嗯,我发现了这个:
“永远不应该使用此模式:XML Schema Recommendation禁止在此命名空间中声明属性”
我想我遇到了麻烦,因为我需要更改XML。问题是XML是从我们拥有的旧程序生成的。任何人都可以确认/不确认我找到了解决方案,否则我会嘲笑任何人的答案吗?