1. Problem
You need to get and/or set
values in a message within an orchestration. There are a number of nodes
that cannot be promoted because they are not unique, and you need to be
able to access these values.
2. Solution
To access values in a message, you
can use XPath. XPath queries are used to navigate the tree of a given
XML document and are typically used within orchestration Message
Assignment and Expression shapes. BizTalk XPath queries require two
parameters: the first parameter references the XML message, and the
second is the query path.
As an example, assume that an orchestration message called msgDemo contains the XML shown in Listing 1.
Example 1. Sample XML Instance for XPath Query Example
<ns0:NewHireList xmlns:ns0="http://SampleSolution.NewHireList"> <DateTime>1999-04-05T18:00:00</DateTime> <ns1:Person xmlns:ns1="http://SampleSolution.Person"> <ID>1</ID> <Name>S. Jonesy</Name> <Role>Embedded Programmer</Role> <Age>40</Age> </ns1:Person> <ns1:Person xmlns:ns1="http://SampleSolution.Person"> <ID>2</ID> <Name>D. Hurley</Name> <Role>Artist</Role> <Age>45</Age> </ns1:Person> </ns0:NewHireList>
|
The following steps demonstrate getting values, getting a node count, getting an entire XML node, and setting values.
To get the value of the <DateTime> element, use the following XPath query. The output of this query is 1999-04-05T18:00:00.
xpath(msgDemo,"string(//*[local-name()='DateTime'])")
To get the value of the <Name> element that is in the same <Person> node as the <ID> which is equal to 2, use the following XPath query. The output of this query will be D. Hurley.
xpath(msgDemo,"string(//*[local-name()='Name' and ../*
[local-name()='ID'] = '2'])")
To get the count of <Person> nodes within the document, use the following XPath query. The output of this query is 2.
xpath(msgDemo,"count(//*[local-name()='Person'])")
To get the entire XML node representation of the second <Person> node, use the following XPath query. Note that this requires formatting the query using the System.String.Format function. The result of this query will be a full XML node.
strXPathQuery = System.String.Format("//*[local-name()='Person'][{0}]",2);
xmlDoc = xpath(msgIncoming,strXPathQuery);
<ns1:Person xmlns:ns1="http://SampleSolution.Person">
<ID>2</ID>
<Name>D. Hurley</Name>
<Role>Artist</Role>
<Age>45</Age>
</ns1:Person>
To set the value of the <DateTime>
element, use the following XPath query. Note that this must be done in a
Message Assignment shape, since the value of the message is changing.
The message used must first be constructed.
xpath(msgDemo, "//*[local-name()='DateTime']") = strDateTime;
3. How It Works
This recipe's solution
demonstrated several of the many uses of XPath. One question that often
arises is when to use XPath instead of using promoted properties. The
ability to promote properties is limited. Elements that repeat within a
schema cannot be promoted. Only unique values can be promoted. When you
need to set the value of repeating nodes, XPath is the quickest and most
versatile approach.