我不能在XML Schema中包含属性。 (http://www.w3.org/2001/XMLSchema-instance使用)

时间:2012-04-20 09:12:58

标签: xml visual-studio-2010 xsd

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

2 个答案:

答案 0 :(得分:1)

您混淆了两个名称空间:XMLSchemaXMLSchema-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)

嗯,我发现了这个:

Link to w3

“永远不应该使用此模式:XML Schema Recommendation禁止在此命名空间中声明属性”

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