【问题标题】:Unqualified XML-element with prefixed namespace inside内部带有前缀命名空间的非限定 XML 元素
【发布时间】:2019-04-09 17:33:58
【问题描述】:

我有以下 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-sn-p,所以我想知道:它是否正确有效?还是只是服务创造者的粗心大意?我问,因为我是 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】:

    首先要注意的是,在您的 XML 文档中声明 xmlns:ns2="http://exception.ws.comarch.gov" 没有任何作用。它只是定义了一个别名ns2,从未使用过。

    生成的两个架构看起来都不错。不过关于它们的一些说明。

    虽然第一个架构非常适合单个 XSD,但通常 elementFormDefault 设置为 qualified 并且不会在架构内更改。在此模式中,form 被设置为 unqualified 用于内部元素。我不能 100% 确定,但我认为使用此模式的验证 XML 解析器会将 verifySignedDocumentReturn 视为其在命名空间“http://signing.ws.comarch.gov”中。我认为更改 XSD 文档中间的 form 是在询问不兼容问题。

    第二组模式看起来不错。

    【讨论】:

    • 感谢您的回复!尽管这些生成的模式看起来不错,但它们都没有完全符合最终的 XML 文档。我也明白,xmlns:ns2="... 什么都不做。它是 SOAP 服务器响应,应该只是解析,而不是发送到任何地方。那么,你的决心是什么? 我可以将 XML-sn-p 视为不好的实践示例还是对某些东西有用?而且,如果有用,有什么用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多