SonarQube 需要单独的 xsd 架构文件并显示错误:“XSD 文件中的错误解析组件" [英] SonarQube requires separate xsd schema files and displays the error: "Error resolving component in XSD file"
问题描述
我在一个项目中使用了两个不同的 xsd 架构文件.
I'm using two different xsd schema files in one project.
第一个是input.xsd
.该文件使用targetNamespace
:
First one is input.xsd
. This file uses targetNamespace
:
<?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>
另一个是input_noTargetNamespace.xsd
.此文件没有 targetNamespace
:
Another is input_noTargetNamespace.xsd
. This file doesn't have targetNamespace
:
<?xml version="1.0" encoding="UTF-8"?>
<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 file looks like:
<?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 架构文件,SonarQube 会显示错误:
If I use these separate xsd schema files in one project, SonarQube shows the error:
解析组件w3s:Mobile"时出错.经检测,w3s:Mobile"在命名空间https://www.w3schools.com"中,但是此命名空间中的组件不可从架构中引用文档.如果这是不正确的命名空间,则可能是'w3s:Mobile' 需要更改.如果这是正确的命名空间,然后应添加适当的导入"标签'input_noTargetNamespace.xsd'.
Error resolving component 'w3s:Mobile'. It was detected that 'w3s:Mobile' is in namespace 'https://www.w3schools.com', but components from this namespace are not referenceable from schema document. If this is the incorrect namespace, perhaps the prefix of 'w3s:Mobile' needs to be changed. If this is the correct namespace, then an appropriate 'import' tag should be added to 'input_noTargetNamespace.xsd'.
有谁知道为什么会这样?如果需要,我可以提供任何其他信息.提前致谢.
Does anyone know why it happens? I can provide any other information if needed. Thanks in advance.
推荐答案
问题已通过以下文件和内容解决:
The issue was solved with the following files and content:
input.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Mobiles
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="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>
</Mobiles>
更具体地说:我修改了 xml 以实现将 XSD 正确链接到 XML 文档 没有命名空间:
To be more specific: I've modified xml to realize correct linking an XSD to an XML document without namespaces:
<Mobiles
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="input.xsd">
因此 input.xsd 看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<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>
由于冗余而不使用 input_noTargetNamespace.xsd
.
对于 xsd 文件,我已更改:
And for xsd file I've changed:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:w3s="https://www.w3schools.com"
targetNamespace="https://www.w3schools.com">
只是为了
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
这篇关于SonarQube 需要单独的 xsd 架构文件并显示错误:“XSD 文件中的错误解析组件"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!