BizTalk编排中使用XPath提取Number字段时XML解析报错求助
问题:BizTalk编排中XPath提取Number字段失败
场景与所用XPath
在BizTalk编排中,尝试通过以下XPath提取输入XML里的Number字段值:
identifier = xpath(XMsg, "/_*[local-name()='x' and namespace-uri()='jabber:x:data']/_*[local-name()='field' and namespace-uri()='jabber:x:data'][@var='Number']/*[local-name()='value' and namespace-uri()='jabber:x:data']");
错误信息
- 核心错误:
XML文档存在错误 - 附加提示:
<code><value xmlns='jabber:x:data'></code> 不符合预期。
输入XML
<ns0:x xmlns:ns0="jabber:x:data"> <ns0:field var="Number" label="Number"> <ns0:value>123456</ns0:value> </ns0:field> <ns0:field var="ID" label="ID"> <ns0:value>id1</ns0:value> </ns0:field> <ns0:field var="Email" label="Email"> <ns0:value>id1@email.com</ns0:value> </ns0:field> <ns0:field var="Mobile" label="Mobile"> <ns0:value>07123456789</ns0:value> </ns0:field> <ns0:field var="Email2" label="Email2"> <ns0:value>id1@email2.com</ns0:value> </ns0:field> <ns0:field var="Status" label="Status"> <ns0:value>Normal</ns0:value> </ns0:field> <ns0:field var="Level" label="Status"> <ns0:value>R</ns0:value> </ns0:field> <ns0:field var="Country" label="Country"> <ns0:value/> </ns0:field> </ns0:x>
对应Schema
<?xml version="1.0" encoding="utf-16"?> <xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:tns="jabber:x:data" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="jabber:x:data" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="x"> <xs:complexType> <xs:sequence minOccurs="0"> <xs:element maxOccurs="unbounded" name="field"> <xs:complexType> <xs:sequence> <xs:element name="value" type="xs:string" /> </xs:sequence> <xs:attribute name="var" type="xs:string" use="required" /> <xs:attribute name="label" type="xs:string" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
解决方案
问题根源
- XPath指向的是
value元素节点,而非节点内的文本内容,BizTalk的xpath()函数无法直接将元素节点赋值给字符串类型变量。 - 输入XML中存在
<ns0:value/>空元素,但Schema定义value为xs:string类型且未允许空值,触发XML验证失败,影响XPath执行。
修正步骤
调整XPath提取文本内容
修改XPath,明确提取节点的文本值:identifier = xpath(XMsg, "string(/*[local-name()='x' and namespace-uri()='jabber:x:data']/*[local-name()='field' and namespace-uri()='jabber:x:data'][@var='Number']/*[local-name()='value' and namespace-uri()='jabber:x:data']/text())");若编排中支持绑定命名空间前缀(如
xmlns:jab="jabber:x:data"),可简化为:identifier = xpath(XMsg, "string(/jab:x/jab:field[@var='Number']/jab:value/text())");处理空值元素
修改Schema,允许value元素为空或存在空值:<xs:element name="value" type="xs:string" nillable="true" minOccurs="0"/>
内容的提问来源于stack exchange,提问作者manibest
相关产品推荐
相关产品推荐

