xml - 如何修复“XSD 文件中的错误解析组件”?
问题描述
我正在使用一个 XSD,它看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML schema -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Mobiles">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Mobile" type="Mobile" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Mobile">
<xsd:sequence>
<xsd:element name="Model" type="xsd:string"/>
<xsd:element name="OS">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Android"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Origin" type="xsd:string"/>
<xsd:element name="Material" type="xsd:string"/>
<xsd:element name="Samsung" type="Samsung"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Samsung" mixed="true">
<xsd:sequence>
<xsd:element name="Wlan">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="802.11"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="CardSlot" type="xsd:string"/>
<xsd:element name="RadioAvailability" type="xsd:boolean" default="true"/>
<xsd:element name="BluetoothAvailability" type="xsd:boolean" default="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
XML文件是:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<p7:Mobiles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p7="https://www.w3schools.com"
xsi:schemaLocation="https://www.w3schools.com input.xsd" >
<Mobile>
<Model>G975F</Model>
<OS>Android</OS>
<Origin>USA</Origin>
<Material>Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>true</BluetoothAvailability>
</Samsung>
</Mobile>
<Mobile>
<Model>G986</Model>
<OS>Android</OS>
<Origin>USA-Israel</Origin>
<Material>Silicon-Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>false</BluetoothAvailability>
</Samsung>
</Mobile>
<Mobile>
<Model>G770F</Model>
<OS>Android</OS>
<Origin>Israel</Origin>
<Material>Silicon-Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>false</BluetoothAvailability>
</Samsung>
</Mobile>
</p7:Mobiles>
使用这个 XSD 我遇到了问题:
解析组件“tns:Mobile”时出错。检测到“tns:Mobile”在命名空间中
'https://www.w3schools.com'
,但来自该命名空间的组件不可从架构文档中引用。如果这是不正确的命名空间,则可能需要更改“tns:Mobile”的前缀。如果这是正确的命名空间,则应将适当的“import”标签添加到“input_noTargetNamespace.xsd”。
为了解决这个问题,我检查了这篇帖子type="Samsung"
,里面有类似的问题,但是我在 的声明中没有任何命名空间前缀Samsung
,所以看起来我错过了其他东西。
有人可以解释这种情况下问题的原因吗?我需要添加一些东西xsd:schema
吗?如果需要,我可以提供任何其他信息。
解决方案
XSD的xsd:schema/@targetNamespace
应与 XML 文档中根元素的命名空间相匹配。
然后,为目标命名空间定义一个命名空间前缀,并使用它来引用 XSD 中的类型。
以下是您的 XSD 和 XML 文件已更正,以便您的 XSD 将成功验证您的 XML:
XSD
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:w3s="https://www.w3schools.com"
targetNamespace="https://www.w3schools.com">
<xsd:element name="Mobiles">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Mobile" type="w3s:Mobile" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Mobile">
<xsd:sequence>
<xsd:element name="Model" type="xsd:string"/>
<xsd:element name="OS">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Android"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Origin" type="xsd:string"/>
<xsd:element name="Material" type="xsd:string"/>
<xsd:element name="Samsung" type="w3s:Samsung"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Samsung" mixed="true">
<xsd:sequence>
<xsd:element name="Wlan">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="802.11"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="CardSlot" type="xsd:string"/>
<xsd:element name="RadioAvailability" type="xsd:boolean" default="true"/>
<xsd:element name="BluetoothAvailability" type="xsd:boolean" default="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<p7:Mobiles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p7="https://www.w3schools.com"
xsi:schemaLocation="https://www.w3schools.com input.xsd" >
<Mobile>
<Model>G975F</Model>
<OS>Android</OS>
<Origin>USA</Origin>
<Material>Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>true</BluetoothAvailability>
</Samsung>
</Mobile>
<Mobile>
<Model>G986</Model>
<OS>Android</OS>
<Origin>USA-Israel</Origin>
<Material>Silicon-Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>false</BluetoothAvailability>
</Samsung>
</Mobile>
<Mobile>
<Model>G770F</Model>
<OS>Android</OS>
<Origin>Israel</Origin>
<Material>Silicon-Plastic</Material>
<Samsung>
<Wlan>802.11</Wlan>
<CardSlot>MicroSD</CardSlot>
<RadioAvailability>true</RadioAvailability>
<BluetoothAvailability>false</BluetoothAvailability>
</Samsung>
</Mobile>
</p7:Mobiles>
推荐阅读
- apache - 时间戳主键 Kudu
- xamarin - Xamarin Android Emulator Manager 不显示所有平台
- python - 未解决的属性引用“YouTube”的“get_videos”类
- java - 在 asp.net 页面中从 android 应用程序接收数据
- android - Android 构建失败 - FormatException
- github - 是否可以仅向 github 中的协作者提供访问权限
- java - 如何使用 jenkins 将 Spring Boot jar 文件部署到 EC2?
- c++ - 如何使此函数使用 getline 读取字符串并使用 int 表现相同?
- android - 我们如何在 MainActivity 中启动一个扩展 AppCompatActivity 的活动
- visual-studio-code - 是否可以在 VS Code 中调试 Service Fabric 应用程序?