我有以下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”属性。
有什么想法吗?
答案 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来声明此内容。