内部带有前缀命名空间的非限定XML元素

问题描述 投票:2回答:1

我有以下XML:

<ns1:verifySignedDocumentResponse xmlns:ns1="http://signing.ws.comarch.gov">
    <verifySignedDocumentReturn xmlns:ns2="http://exception.ws.comarch.gov">Some string content...</verifySignedDocumentReturn>
</ns1:verifySignedDocumentResponse>

verifySignedDocumentReturn的情况下,我想知道,定义前缀(xmlns:ns2=...)是正确的,但是不能用这个前缀限定(ns2:verifySignedDocumentReturn)相应的元素吗?

w3schools.com gives examples,显示:

  1. 如果元素带有前缀,则必须定义前缀的名称空间。
  2. 如果使用默认命名空间,则元素不应加前缀。

但在我的示例中没有默认命名空间。所以,我希望verifySignedDocumentReturnns2为前缀。

我从实际服务中得到了这个XML片段,所以我想知道:它是正确有效的吗?或者只是服务创作者的疏忽?我问,因为我是XML / XSD的新手。

我尝试使用不同的在线生成器从这个XML生成XSD,但没有生成的模式看起来合理。

变体1(根本不考虑ns2命名空间):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:ns1="http://signing.ws.comarch.gov">
   <xs:element name="verifySignedDocumentResponse">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="verifySignedDocumentReturn" form="unqualified" 
                    type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
 </xs:element>

变式2:

schema0.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:ns1="http://signing.ws.comarch.gov" 
           xmlns:ns2="http://exception.ws.comarch.gov" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="schema1.xsd" />
  <xs:element name="verifySignedDocumentResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="verifySignedDocumentReturn" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

schema1.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="verifySignedDocumentReturn" type="xs:string" />
</xs:schema>
xml xsd xsd-validation
1个回答
1
投票

首先要注意的是,XML文档中的xmlns:ns2="http://exception.ws.comarch.gov"声明什么都不做。它只是定义了一个从不使用的别名ns2。

生成的模式都看起来不错。关于他们的一些注意事项。

虽然第一个模式整齐地适合单个XSD,但通常elementFormDefault设置为qualified并且不会在模式中更改。在这个模式中,form被设置为内部元素的unqualified。我不是百分百肯定,但我认为使用此模式的验证XML解析器会将verifySignedDocumentReturn视为名称空间“http://signing.ws.comarch.gov”。我认为在XSD文档中间更改form会导致不兼容问题。

第二组模式看起来不错。

© www.soinside.com 2019 - 2024. All rights reserved.