秋枫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

郑佐 2006-7-2

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" ”去掉,验证通过。

分析原因:BizTalkSchema Editor中编辑Schema,默认情况下target namespace属性仅对Root record有效,而常规的XML文件的默认namespace对其所有的fieldrecord都有效,因此在使用对应Schema进行验证时失败。

解决途径:
SchemaElement 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

image001.jpg

通过POMap.btm右键菜单“属性”设置“测试验证输入实例”和“测试验证输出实例”,右键点击“测试映射”,提示成功。

输出文件为POout.xml
<ns0:Root PONumber="1" Date="1999-05-31T13:20:00.000-05:00" xmlns:ns0="http://Zhengzuo.ContentTransmit.POout" />
如果设置POout.xsdAttribute FormDefault属性值为Qualified,输出内容变为,

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

去掉POout.xsdTarget 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"
值。

posted on 2006-08-02 17:33  秋枫  阅读(521)  评论(0编辑  收藏  举报