我正在尝试重写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;
......但仍然没有好处。有什么建议吗?
谢谢!
答案 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,这将返回给您的预期输出:)