模式中的扩展元素(使用xs:redefine)在导入第三个模式时具有错误的命名空间

时间:2017-11-23 14:51:05

标签: visual-studio xsd biztalk biztalk-2013

以下是该方案。我正在使用BizTalk实现ESB,我有一个架构,我正在使用它作为通过BizTalk的消息的进程头。标头架构将导入到所有规范架构中。进程头元素被提升并用于路由。这种方法效果很好。但是现在我想为某些消息类型扩展这个原始进程头模式。我以为我会使用xs:redefine来修改主进程头并添加其他元素。但是当我将重新定义的模式导入到规范模式时,新的进程标头元素将获取规范模式的名称空间,而不是它扩展的进程标头模式的名称空间。 以下是一些正在发生的事情的简化示例: 1. OriginalProcessSchema.xsd

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:mh="http://ProcessHeaderNamespace" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" elementFormDefault="qualified" targetNamespace="http://ProcessHeaderNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MessageHeader" type="mh:ProcessHeader">

  </xs:element>
    <xs:complexType name="ProcessHeader">
      <xs:sequence>
        <xs:element name="Field1" type="xs:string" />
        <xs:element name="Field2" type="xs:string" />
      </xs:sequence>
    </xs:complexType>

</xs:schema>

2.ExtendedProcessHeaderSchema.xsd - 重新定义第一个

的那个
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:mh="http://ProcessHeaderNamespace" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" elementFormDefault="qualified" targetNamespace="http://ProcessHeaderNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation=".\OriginalProcessSchema.xsd">
    <xs:complexType name="ProcessHeader">
      <xs:complexContent mixed="false">
        <xs:extension base="mh:ProcessHeader">
          <xs:sequence>
            <xs:element name="Field3" type="xs:string" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
</xs:schema>

3.CanonicalSchema.xsd - 导入第二个模式。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://ProductNamespace" xmlns:ph="http://ProcessHeaderNamespace" targetNamespace="http://ProductNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation=".\ExtendedProcessHeaderSchema.xsd" namespace="http://ProcessHeaderNamespace" />
  <xs:annotation>
    <xs:appinfo>
      <b:references>
        <b:reference targetNamespace="http://ProcessHeaderNamespace" />
      </b:references>
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="Product">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ProcessHeader" type="ph:ProcessHeader" />
        <xs:element name="ProductDate">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Field4" type="xs:string" />
              <xs:element name="Field5" type="xs:string" />
              <xs:element name="Field6" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

如果我在visual studio中生成第二个文件的实例,所有元素都在同一个命名空间中:

<ns0:MessageHeader xmlns:ns0="http://ProcessHeaderNamespace">
  <ns0:Field1>Field1_0</ns0:Field1>
  <ns0:Field2>Field2_0</ns0:Field2>
  <ns0:Field3>Field3_0</ns0:Field3>
</ns0:MessageHeader>

但是,如果我生成第三个文件的实例,这就是我所看到的:

<ns0:Product xmlns:ns0="http://ProductNamespace">
  <ProcessHeader>
    <ns1:Field1 xmlns:ns1="http://ProcessHeaderNamespace">ph:Field1_0</ns1:Field1>
    <ns1:Field2 xmlns:ns1="http://ProcessHeaderNamespace">ph:Field2_0</ns1:Field2>
    <ns0:Field3>Field3_0</ns0:Field3>
  </ProcessHeader>
  <ProductDate>
    <Field4>Field4_0</Field4>
    <Field5>Field5_0</Field5>
    <Field6>Field6_0</Field6>
  </ProductDate>
</ns0:Product>

Field3位于Product canonical(此示例中为ProductNamespace)的命名空间中。我希望它在ProcessHeader命名空间中。一位同事用不同的工具(oXygen xml)查看了这个,实际上进程头中所有元素的命名空间都是一样的。这是Visual Studio / Biztalk中的一个错误吗?任何人都可以了解这里发生的事情或提供解决方案吗?

我正在使用Visual Studio 2013和BizTalk Server 2013

1 个答案:

答案 0 :(得分:0)

我会以这种方式回答问题。你甚至不试图这样做就解决了这个问题。

意思是,试图创造一个可扩展的&#39;架构框架比它的价值更麻烦。 cXml,ebXml等都是这样做的,他们疯了,愚蠢地难以使用

这种不必要且昂贵的复杂性是一个巨大的原因(IMO)为什么JSON会以它的方式起作用。

使用 xs:include 作为标题,我甚至会考虑使用空命名空间

我在这里用BizTalk写了这个:BizTalk: Simplify BizTalk Dev by Using the Empty Namespace