XML验证:不需要前缀吗?

时间:2018-07-12 12:45:33

标签: xml xsd

我正在尝试验证以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<xrm:plugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.moss.fr/2011/connecteur_xrm testplugin.xsd" xmlns:tech="http://www.moss.fr/2011/moteur-xrm" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns:attribut="http://www.moss.fr/2012/attribut" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mcd="urn:SCCOA-schemaInfo" xmlns:xrm="http://www.moss.fr/2011/connecteur_xrm" xmlns:variable="http://www.moss.fr/2012/variable" xmlns:doc="http://www.moss.fr/2011/documentation" xmlns:mtf2xsd="http://www.moss.fr/2010/mtf2xsd" xmlns:conv="http://www.moss.fr2010/conversion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:info="http://www.moss.fr/2011/information" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema">
<xrm:mapping occurs="xrm:mapping">
  <SBEGestionZonesAeriennesSYSCA xmlns=""
                                 info:obligatoire="true"
                                 occurs="/grappe"
                                 info:contexte="/grappe">
  </SBEGestionZonesAeriennesSYSCA>
 </xrm:mapping>
</xrm:plugin>

我正在使用主要模式 testplugin.xsd

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xrm="http://www.moss.fr/2011/connecteur_xrm" xmlns:nr0="http://NamespaceTest.com/balisesXrm" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns:metier="urn:SBEGestionZonesAeriennesSYSCA-schema"  targetNamespace="http://www.moss.fr/2011/connecteur_xrm" elementFormDefault="qualified" attributeFormDefault="unqualified" >
 <xsd:import namespace="http://NamespaceTest.com/balisesXrm"  schemaLocation="balisesXrm.xsd" />
 <xsd:import namespace="urn:SBEGestionZonesAeriennesSYSCA-schema" schemaLocation="metier1.xsd"/>

<xsd:complexType name="mapping">
      <xsd:sequence>
         <xsd:element ref="metier:SBEGestionZonesAeriennesSYSCA"/>
      </xsd:sequence>
</xsd:complexType>

 <xsd:element name="plugin">
  <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="mapping" type="xrm:mapping"/>
     </xsd:sequence>
  </xsd:complexType>

使用导入的 metier1.xsd

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:nr0="http://NamespaceTest.com/balisesXrm" xmlns:xalan="http://xml.apache.org/xslt" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema"  attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema" version="3.2.1ec">

  <xsd:element name="SBEGestionZonesAeriennesSYSCA" type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>


 <xsd:complexType name="type_SBEGestionZonesAeriennesSYSCA">

   <xsd:sequence>

     <xsd:element maxOccurs="unbounded" name="Entities" type="SBEGestionZonesAeriennesSYSCA:type_Data_SBEGestionZonesAeriennesSYSCA"/>

   </xsd:sequence>

  <xsd:attributeGroup ref="attributsXrm"/>
 </xsd:complexType>

<xsd:attributeGroup name="attributsXrm">
  <xsd:attribute name="group-by"/>
  <xsd:attribute name="id"/>
  <xsd:attribute name="occurs"/>
</xsd:attributeGroup>

</xsd:schema>

尝试验证XML时出现以下错误:

  

发现从元素'SBEGestionZonesAeriennesSYSCA'开始的无效内容。预计{“ urn:SBEGestionZonesAeriennesSYSCA-schema”:SBEGestionZonesAeriennesSYSCA之一。

我尝试在我的XML文档中将xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema"更改为xmlns:s="urn:SBEGestionZonesAeriennesSYSCA-schema",并在SBEGestionZonesAeriennesSYSCA上添加前缀s:,它可以正常工作。 但是我不明白为什么我必须在这种情况下加一个前缀。实际上,如果可能的话,我不想修改我的XML文档,而是我的XSD。 非常感谢。

1 个答案:

答案 0 :(得分:1)

您应该在XML的xmlns=""标记上删除SBEGestionZonesAeriennesSYSCA属性,它将标记设置在空的命名空间中。

如果没有此设置,则xmlns标签将正确考虑在xrm:plugin标签上指定的urn:SBEGestionZonesAeriennesSYSCA-schema,即预期的SBEGestionZonesAeriennesSYSCA

修改XSD而不是XML似乎是个坏主意,但如果确实需要,则需要让XSD在空名称空间中定义SBEGestionZonesAeriennesSYSCA元素,您可以通过删除metier1.xsd根目录上的targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema"属性,并更新对testplugin.xsd中元素的引用。