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

分析原因:在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,


通过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"
值。