[BizTalk开发基础]xpath in orchestration
在Orchestration中我们常常需要:
1)从Message中取值来做判断(比如提取CustomerMessage中的IsVIP来做不同的业务处理)等。
2)修改Message中的某些值,然后做业务处理,比如提取CustomerMessage中的IsVIP值,如果IsVIP=true,则赠送100美元的购物券等等。
xpath函数的签名:xpath(message, xpathString)
在开发中,经常遇到xpath函数在运行时出错,调试起来很不方便,所以在写xpathString时一定要小心。比如在取一个字符型结点的值时,可以用XPath string(),尽量使用local-name()和namespace-uri()。
示例:
<?xml version="1.0" encoding="utf-16" ?>
<Items>
<Item Code="Item001" Price="18.00" Qty="1"/>
<Item Code="Item002" Price="18.00" Qty="2"/>
<Item Code="Item003" Price="18.00" Qty="3"/>
</Items>
</SalesOrder>
1)取SalesOrder中Item的个数
count(/*[local-name()='SalesOrder']/*[local-name()='Items']/*[local-name()='Item'])
2)取第一个Item的Code
string(/*[local-name()='SalesOrder']/*[local-name()='Items']/*[local-name()='Item'][1]/@Code)
3)取第一个Item的Qty
number(/*[local-name()='SalesOrder']/*[local-name()='Items']/*[local-name()='Item'][1]/@Code)
在开发过程中,有时候我们经常会个性Schema,所以会涉及到个性xpath,那时候我们可能就要去Orchestration中去找这些xpath然后修改了。这样很不方便,相对可行的方法是把所有要用的xpath写在一个helper类中或者写在配置文件中。
也可以先利用XPathNavigator对xpath进行充分的单元测试。可以参考下面的示例代码:
2 class TestXPathStatements
3 {
4 [Test]
5 public void TestXPathSalesOrderItemCount()
6 {
7 object val = EvalXPath("SalesOrder.xml", XPathConstants.SALESORDER_ITEM_COUNT);
8 }
9
10 private object EvalXPath(string xmlInstance, string xpath)
11 {
12 string filePath = Path.Combine(
13 Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XmlInstance"),
14 xmlInstance);
15
16 using (StreamReader sr = new StreamReader(filePath))
17 {
18 XPathDocument xpathDoc = new XPathDocument(sr);
19 XPathNavigator nav = xpathDoc.CreateNavigator();
20
21 return nav.Evaluate(xpath);
22 }
23 }
24 }
posted on 2010-03-14 19:43 James.H.Fu 阅读(322) 评论(0) 编辑 收藏 举报