[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" ?>

<SalesOrder>
    
<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进行充分的单元测试。可以参考下面的示例代码:

 1 [TestFixture]
 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编辑  收藏  举报

导航