1

我正在尝试重写 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 & 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;

……但还是不行。有什么建议么?

谢谢!

4

2 回答 2

4

1-您可以尝试以下几件事:

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

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

2- 从不同的方向来,您可以使用 WCF-自定义 Adpater 配置的消息选项卡上的入站 BizTalk 消息正文的路径选项。

于 2013-11-06T21:19:33.213 回答
0

我也面临着类似的问题,但是当我浏览了你的各种解决方案时,我得到了我的问题的解决方案。

对我来说这有效**

rawClaimString = xpath(ClaimXmlResponse, "string(same xpath as above)");

**

谢谢你的声音;)

为您的问题找到解决方案,您可以区分提升保存响应的节点,并尝试使用 .notation 访问该节点并将其分配给 sting,这将向您返回预期的输出:)

于 2014-09-13T18:42:13.657 回答