BizTalk Server简单xml架构使用举例

BizTalk Server 简单xml架构使用举例
作者:郑佐
日期:2006-08-02
 
在BizTalk项目中如果使用业务编排,一般会有一个接收报文和发送报文之间进行架构Mapping的过程。在BizTalk项目中添加xml架构的时候,如果xml报文带有namespace,可能会碰到架构无法验证问题,需要设置属性解决。本文针对初次开发BizTalk项目的开发者。
假设有一个输入订单报文,文件名为POin.xml,报文内容如下。

<Root xmlns="http://Zhengzuo.ContentTransmit.POin">
 <PONumber>1</PONumber>
 <Date>1999-05-31T13:20:00.000-05:00</Date>
</Root>

 
在项目中添加“新项”,选择“架构文件”添加架构POin.xsd文件。编辑生成的文件架构如下。

<?xml version="1.0" encoding="utf-16" ?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://Zhengzuo.ContentTransmit.POin" targetNamespace="http://Zhengzuo.ContentTransmit.POin" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="PONumber" type="xs:string" />
<xs:element name="Date" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

 
选中POin.xsd文件右键菜单“属性”,在“输入实例名文件”中指定POin.xml,通过右键菜单验证该文件实例,
 
出错提示:
错误1   元素 命名空间“http://Zhengzuo.ContentTransmit.POin”中的“Root”。的子元素 命名空间“http://Zhengzuo.ContentTransmit.POin”中的“PONumber”。 无效。应为可能元素的列表: “PONumber”。    C:/POin.xml
错误2   对架构 POin.xsd 验证实例文件失败,文件: <file:///C:/POin.xml>。E:/vs2005projects/Test Projects/BizTalk Server Test/Zhengzuo.ContentTransmit/POin.xsd
 
如果把报文中的命名空间“xmlns="http://Zhengzuo.ContentTransmit.POin" ”去掉,验证通过。
 
分析原因: 在BizTalk的Schema Editor中编辑Schema,默认情况下target namespace属性仅对Root record有效,而常规的XML文件的默认namespace对其所有的field和record都有效,因此在使用对应Schema进行验证时失败。
 
解决途径:
将Schema的Element FormDefault属性由Unqualified 默认值改为 Qualified,使target namespace属性对其所有record 和field都有效。通过设置,报文实例验证通过。
 
编写输出架构文件,文件名为POout.xsd,定义结构如下,

<?xml version="1.0" encoding="utf-16" ?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://Zhengzuo.ContentTransmit.POout" targetNamespace="http://Zhengzuo.ContentTransmit.POout" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
       <xs:attribute name="PONumber" type="xs:string" />
       <xs:attribute name="Date" type="xs:dateTime" />
  </xs:complexType>
</xs:element>
</xs:schema>

 
建立架构映射,文件名为POMap.btm,
BizTalk Server简单xml架构使用举例_第1张图片
通过POMap.btm右键菜单“属性”设置“测试验证输入实例”和“测试验证输出实例”,右键点击“测试映射”,提示成功。
输出文件为POout.xml,

<ns0:Root PONumber="1" Date="1999-05-31T13:20:00.000-05:00" xmlns:ns0="http://Zhengzuo.ContentTransmit.POout" />

 
如果设置POout.xsd的Attribute FormDefault属性值为Qualified,输出内容变为,

<ns0:Root ns0:PONumber="1" ns0:Date="1999-05-31T13:20:00.000-05:00" xmlns:ns0="http://Zhengzuo.ContentTransmit.POout" />

 
去掉POout.xsd的Target Namespace属性的值,输出结果变为,

<Root PONumber="1" Date="1999-05-31T13:20:00.000-05:00" />

 
如果已经有报文样例存在,可以通过BizTalk自带的xml架构生成向导来生成架构文件,就可避免验证出现的问题。
操作步骤如下,
1 .在BizTalk项目中右键点击“添加”—“添加生成的项”, 在窗口中选择“生成架构”,点击添加“按钮”。
2 .在Biztalk架构生成器窗口中的文档类型中选择“Well-Formed XML”,输入文件设置为“POin.xml”,点击“确定”完成。
生成的schema文件内容如下,

<?xml version="1.0" encoding="utf-16" ?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://Zhengzuo.ContentTransmit.POin" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="PONumber" type="xs:unsignedByte" />
<xs:element name="Date" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

 
可见根节点增加了以下属性。
attributeFormDefault="unqualified"
elementFormDefault="qualified"
 
对于可选元素,比如输入订单报文修改称,Date元素变为可选:

<Root xmlns="http://Zhengzuo.ContentTransmit.POin">
 <PONumber>1</PONumber> 
</Root>

 
此时,验证架构会出现 错误BEC2004: 元素“Root”的内容不完整。应为可能元素的列表: “Date”。
这是由于元素节点的“Min Occurs”和“Max Occurs”属性默认值为1,也就是说该元素至少出现一次,而且只允许出现一次。设置“Min Occurs”属性值为0就可以验证通过。如果允许该元素出现多次可以设置“Max Occurs”属性值为n,或“*”,n表示数字,*表示不确定的最大个数,BizTalk项目中的架构编辑器会自动把*变为“unbounded”。修改后的架构显示如下,

<?xml version="1.0" encoding="utf-16" ?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://Zhengzuo.ContentTransmit.POin" elementFormDefault="qualified" targetNamespace="http://Zhengzuo.ContentTransmit.POin" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="PONumber" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="Date" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

 

你可能感兴趣的:(BizTalk Server简单xml架构使用举例)