SonarQube 需要单独的 xsd 架构文件并显示错误:“XSD 文件中的错误解析组件" [英] SonarQube requires separate xsd schema files and displays the error: "Error resolving component in XSD file"

查看:28
本文介绍了SonarQube 需要单独的 xsd 架构文件并显示错误:“XSD 文件中的错误解析组件"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个项目中使用了两个不同的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆