在一个xml中使用两个模式

时间:2009-12-16 15:36:25

标签: xml xsd

我有以下xsd文件:

SchemaA

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber" type="xs:int">
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

SchemaB

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaB"
           elementFormDefault="qualified"
           xmlns="http://schemaB" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:attribute name="Name" type="xs:string" />
</xs:schema>

我正在尝试引用它们并从以下XML中使用它们:

<?xml version="1.0"?>
<Configuration xmlns="http://schemaA"
               xmlns:ba="http://schemaB">
    <StationNumber ba:Name="aaa">1</StationNumber>
</Configuration>

Visual Studio 2008在描述中将ba:Name命名为错误:未声明“http://schemaB:Name”属性。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这不是两个架构问题,您的架构与您的文档内容不匹配。属性名称未列为配置的可能属性之一。

仅仅因为您声明了一个全局属性,并不意味着您可以在任何地方使用它。您将要么必须将一个架构导入另一个架构,并指定该属性可以在配置中进行,如上面ewernli给出的第一个答案所示。

或者您允许第二个命名空间中的任何属性出现在第一个模式中,例如:

<xs:element name="Configuration">
  <xs:complexType>
    <xs:all>
        <xs:element name="StationNumber" type="xs:int"/>
    </xs:all>
    <xs:anyAttribute namespace="http://schemaB"/>
  </xs:complexType>
</xs:element>

已更改:跟随以下ewernli的评论,这正确地指出这还有一个问题,即StationNumber属于简单类型。如果要准备类型以获取属性,则需要强制它复杂化:

<xs:element name="Configuration">
  <xs:complexType>
    <xs:all>
      <xs:element name="StationNumber">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:int"/>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:anyAttribute namespace="http://schemaB"/>
  </xs:complexType>
</xs:element>

现在您可以按上述方式附加属性。

答案 1 :(得分:1)

如果元素StationNumber在schemaA中不包含属性,则<StationNumber ba:Name="...">...</StationNumber>无效。

解决方案1 ​​:在schemaB中嵌入schemaA并正确定义属性

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:int">
                                <xs:attribute name="Name" type="xs:string"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

然后,NetBeans将验证以下XML:

   <ns2:Configuration  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
       xmlns:ns2='http://schemaA'
       xsi:schemaLocation='http://schemaA file:/.../src/schemaA.xsd
       http://xml.netbeans.org/schema/schemaB file:/.../schemaB.xsd'>
              <ns2:StationNumber Name="aaa">1</ns2:StationNumber>
    </ns2:Configuration>

解决方案2 :您仍然可以单独schemaB来定义属性,但需要将其schemaA导入ref:< / p>

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:ba='http://schemaB'
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

                <xs:import namespace="http://schemaB"
                 schemaLocation="schemaB.xsd"/>

 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:int">
                                 <xs:attribute ref="ba:Name"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

然后XML看起来像这样:

<ns1:Configuration  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:ns1='http://schemaA'
   xmlns:ba='http://schemaB'
   xsi:schemaLocation='http://schemaA file:/.../schemaA.xsd'>
    <ns1:StationNumber ba:Name="aaa"  >1</ns1:StationNumber>
</ns1:Configuration>

答案 2 :(得分:0)

它需要能够从命名空间中找到XSD,这就是它所抱怨的内容。您可以使用实例文档中的schemaLocation来声明此内容。