以下是该方案。我正在使用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
答案 0 :(得分:0)
我会以这种方式回答问题。你甚至不试图这样做就解决了这个问题。
意思是,试图创造一个可扩展的&#39;架构框架比它的价值更麻烦。 cXml,ebXml等都是这样做的,他们疯了,愚蠢地难以使用。
这种不必要且昂贵的复杂性是一个巨大的原因(IMO)为什么JSON会以它的方式起作用。
使用 xs:include 作为标题,我甚至会考虑使用空命名空间。
我在这里用BizTalk写了这个:BizTalk: Simplify BizTalk Dev by Using the Empty Namespace