BizTalk Orchestration中XPath提取XML <Any>元素值返回null的问题
解决BizTalk Orchestration里提取类型Base64Container值的问题
1. 先搞定XPath命名空间的坑
return (<Any>类型的元素一般都带目标命名空间,XPath查询必须指定正确的命名空间才能匹配到元素。假设你的Base64Container所在的命名空间是`http://your-target-namespace`,在表达式编辑器里这么写: ```c# // 先声明命名空间 XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable()); nsMgr.AddNamespace("ns", "http://your-target-namespace"); // 再执行XPath查询 string base64Value = XPath(myXmlMessage, "string(//ns:Base64Container)", nsMgr); ``` ## 2. 确认<Any>节点的层级路径 BizTalk里<Any>会把外部XML片段嵌入进来,你的XPath得穿透这个<Any>节点才行。比如Schema里<Any>对应的元素名就是`<Any>`,那路径得加上它: ```c# // 假设<Any>直接包裹着Base64Container string base64Value = XPath(myXmlMessage, "string(//Any/ns:Base64Container)", nsMgr); ``` ## 3. 换用XPathNavigator手动遍历试试 要是直接用XPath函数返回null,不如手动用XPathNavigator走一遍: ```c# XPathNavigator nav = myXmlMessage.CreateNavigator(); // 先定位到<Any>节点,注意用消息的目标命名空间 nav.MoveToFollowing("Any", myXmlMessage.SchemaInstance.TargetNamespace); // 再定位到Base64Container节点 if (nav.MoveToFollowing("Base64Container", "http://your-target-namespace")) { string base64Value = nav.Value; } ``` ## 4. 检查XML结构和Schema设置 得确认你的XML里Base64Container确实在<Any>节点内部,比如结构是这样的: > <Root> > <Any> > <ns:Base64Container>SGVsbG8gV29ybGQh</ns:Base64Container> > </Any> )
另外看Schema里ProcessContents是不是设成lax或者skip——要是设成strict,BizTalk可能会过滤掉
5. 先调试看完整XML
实在找不到问题,先把整个XML输出到事件日志,确认
// 写日志用于调试 System.Diagnostics.EventLog.WriteEntry("BizTalk Debug", myXmlMessage.Xml.ToString());
内容的提问来源于stack exchange,提问作者navi
相关产品推荐
相关产品推荐

