1

我正在尝试制作一个 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部分还是有另一种方法可以在模式中写入/包含属性。我该如何解决这个问题?

4

2 回答 2

1

您混淆了两个名称空间:XMLSchemaXMLSchema-instance. 这两个服务于不同的目的,XMLSchema(通常带有前缀xs)用于声明您的架构。这就是为什么没有它您的 XSD 文件就无法工作的原因。

当您想在文档中使用某些 XML 模式时,将使用名称空间XMLSchema-instance(通常带有前缀)。例如,前缀在此命名空间中。xsischemaLocation

类型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,因为这很有意义,但从技术上讲,它不是必需的。

于 2012-04-20T10:13:23.020 回答
0

嗯,我发现了这个:

链接到 w3

“这个模式永远不应该这样使用:XML 模式建议禁止在这个命名空间中声明属性”

我想我当时遇到了麻烦,因为那时我需要更改 XML。问题是 XML 是从我们拥有的旧程序生成的。任何人都可以确认/不确认我找到了解决方案,否则我会应用其他人的答案吗?

于 2012-04-20T09:43:49.900 回答