xpath查询无法在BizTalk业务流程中工作

时间:2013-11-06 20:49:36

标签: biztalk biztalk-2010

我正在尝试重写BizTalk 2010应用程序并取消外部程序集,但我似乎遇到了xpath问题。

我们有一个将医疗保健声明(837P)作为xml存储在数据库中的流程,我们需要稍后提取它。我有一个WCF端口调用存储过程,该存储过程返回如下所示的xml消息:

<ClaimXml_SEL_GetClaimXmlResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo">
   <StoredProcedureResultSet0>
      <StoredProcedureResultSet0 xmlns="http://schemas.microsoft.com/Sql/2008/05/ProceduresResultSets/dbo/ClaimXml_SEL_GetClaimXml">
         <Claim><![CDATA[<ns0:X12_00401_837_P (etc.)

所以我需要做的是提取实际的837P消息 - 以ns0开头的部分:X12_00401_837_P。

帮助程序类非常简单,只需要这样的方法:

public XmlDocument ExtractClaimXml(XmlDocument xDoc)
{
   XmlDocument xReturn = new XmlDocument();

   XmlNode node = xDoc.SelectSingleNode("/*[local-name()='ClaimXml_SEL_GetClaimXmlResponse' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo']/*[local-name()='StoredProcedureResultSet0' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo']/*[local-name()='StoredProcedureResultSet0' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/ProceduresResultSets/dbo/ClaimXml_SEL_GetClaimXml']/*[local-name()='Claim' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/ProceduresResultSets/dbo/ClaimXml_SEL_GetClaimXml']");

   xReturn.LoadXml(node.InnerText);

   return xReturn;
}

然后消息分配形状具有以下代码:

rawClaimXml = ClaimXmlResponse;
strippedClaim = XmlHelperClass.ExtractClaimXml(rawClaimXml);
Claim837P = strippedClaim;

...其中ClaimXmlResponse;在上面显示的消息中,Claim837P是837P消息,而rawClaimXml&amp; strippedClaim是xml变量。这很好用,但调用外部程序集似乎太过分了。

我在assingment形状中尝试了这个:

rawClaimXml = xpath(ClaimXmlResponse, "same xpath as above");
strippedClaim.LoadXml(rawClaimXml.InnerText);
Claim837P = strippedClaim;

...但是得到错误“'UnderlyingXmlDocument.InnerText':.NET属性是只写的,因为它没有get访问器”。

然后我尝试从xpath查询中获取一个字符串:

rawClaimString = xpath(ClaimXmlResponse, "string(same xpath as above)");
rawClaimString = rawClaimString.Replace("<![CDATA[", "");
rawClaimString = rawClaimString.Replace(">]]>",">");
strippedClaim.LoadXml(rawClaimString);
Claim837P = strippedClaim;

......但这并不好。还尝试了一个变种:

rawClaimXml = xpath(ClaimXmlResponse, "same xpath as above");
rawClaimString = rawClaimXml.InnerXml.ToString();
rawClaimString = rawClaimString.Replace("<![CDATA[", "");
rawClaimString = rawClaimString.Replace(">]]>",">");
strippedClaim.LoadXml(rawClaimString);
Claim837P = strippedClaim;

......但仍然没有好处。有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

1- 您可以尝试以下几种方法:

  • string()函数中包装xpath。 xpath(ClaimXmlResponse, "string(same xpath as above)");
  • /text()节点附加到xpath。 xpath(ClaimXmlResponse, "same xpath as above/text()");
  • 两者的结合。

你能详细说明这个目标吗?使用帮助程序类没有任何问题。如果是困扰你的额外程序集,你可以随时将.cs添加到BizTalk项目中。

2- 来自不同的方向,您可以在WCF-Custom Adpater配置的Messages选项卡上使用Path选项进行Inbound BizTalk消息正文。

答案 1 :(得分:0)

我也遇到了类似的问题但是当我通过各种解决方案时,我得到了解决问题的方法。

对我而言,这工作**

  

rawClaimString = xpath(ClaimXmlResponse,&#34; string(与x相同的xpath)   以上)&#34);

**

感谢phew;)

为了解决您的问题,您可以明显地提升持有您的响应的节点,并尝试使用.notation访问该节点,并将其分配给sting,这将返回给您的预期输出:)