【问题标题】:how to handle multiple namespaces with different URI in XSD如何在 XSD 中处理具有不同 URI 的多个命名空间
【发布时间】:2021-01-25 13:19:03
【问题描述】:

我有一个类似于 ::

的 XML (first.xml)
 <?xml version="1.0" encoding="utf-8"?>
 <saw:jobInfo xmlns:saw="com.analytics.web/report/v1.1">     
      <saw:jobStats>...........</saw:jobStats>    
       <saw:detailedInfo> .....</saw:detailedInfo>    
       <saw:fileInfo>..........</saw:fileInfo>
 </saw:jobInfo> 

下面的 XML (second.xml) 与上面的相同,但名称空间不同。

<?xml version="1.0" encoding="utf-8"?> 
 <soap:jobInfo xmlns:soap="urn://bi.webservices/v6">  
   <soap:jobStats>...........</saw:jobStats>
   <soap:detailedInfo> .....</saw:detailedInfo>    
   <soap:fileInfo>..........</saw:fileInfo>
 </soap:jobInfo> 

由于我在两个 xml 中具有相同的元素和属性名称,因此我使用相同的 xsd 文件来验证两者。

XSD 文件::

 <?xml version="1.0" encoding="utf-8" ?>  
 <xs:schema targetNamespace="com.analytics.web/report/v1.1"      
  xmlns="com.analytics.web/report/v1.1" 
  xmlns:saw="com.analytics.web/report/v1.1" 
  xmlns:soap="urn://bi.webservices/v6"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"> 

在包含 xmlns:soap="urn://bi.webservices/v6" 后,模式验证失败,因为 second.xml 说未知元素“soap:jobinfo”。我四处寻找,发现 targetNamespace 值应该与命名空间 URI 相同。 请告诉我如何为具有不同 URI 的两个不同命名空间使用相同的 XSD。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    简短的回答是你不能。但是,如果您要使用三个 XSD,则可以。它将允许您将所有重要的 XSD 放入一个文件 (Chameleon.XSD),并有两个简单地组成 Chameleon.XSD,这两个具有您想要的命名空间。

    Chameleon.XSD

    <?xml version="1.0" encoding="utf-8"?>
    <!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="jobInfo">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="jobStats" type="xsd:string" />
            <xsd:element name="detailedInfo" type="xsd:string" />
            <xsd:element name="fileInfo" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    

    JobInfo1.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
    <xsd:schema xmlns="com.analytics.web/report/v1.1" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="com.analytics.web/report/v1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:include schemaLocation="Chameleon.xsd"/>
    </xsd:schema>
    

    JobInfo2.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
    <xsd:schema xmlns="urn://bi.webservices/v6" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn://bi.webservices/v6" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:include schemaLocation="Chameleon.xsd"/>
    </xsd:schema>
    

    关系:

    如果您想要一个 XSD 来验证所有这些,那么您可以构建第四个,导入这两个。

    OneAll.XSD

    <?xml version="1.0" encoding="utf-8"?>
    <!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
    <xsd:schema xmlns="urn:tempuri-org:XSD:1" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:tempuri-org:XSD:1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:import namespace="com.analytics.web/report/v1.1" schemaLocation="JobInfo1.xsd"/>
        <xsd:import namespace="urn://bi.webservices/v6" schemaLocation="JobInfo2.xsd"/> 
    </xsd:schema>
    

    更新关系:

    【讨论】:

    • @@Petru:非常感谢您的回复。我不能制作 Chameleon.XSD,因为有很多 XSD。请用图表或例子说明,以便我更好地理解。
    • @prathima,我已经更新了我的回复,只是时间......如果你有包含其他命名空间的非常复杂的模式,那么你无法实现你想要的,不管变色龙与否。变色龙的想法是假设构成它的模式的名称空间。因此,您可以在不同的命名空间中拥有相同的结构,而不会重复。要记住的一件事是一个 XSD = 一个命名空间。
    【解决方案2】:

    second.xml 中的结束标记需要与开始的 rags 匹配(即soap 不等于 saw)

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多