技术开发 频道

BizTalk Server中简单xml架构使用

【IT168 技术文档】

    在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" 值。

0
相关文章