Für das Handling von Messages in Orchstrations gibt es verschiedene Möglichkeiten.
Eine gute Beschreibung ist von Matt Meleski "Constructing BizTalk 2004 XML Messages (In an Orchestration) - Choices"
Nebenbei haben sich bei mir noch folgende Varianten angesammelt
XmlDocument-Variable
ganz nett um Tracing ausgeben zu können
xmlDocument = msgEai;
System.Diagnostics.Trace.WriteLine("Message: " + xmlDocument.OuterXml);
XPath
direkter Zugriff aus Xml-Elemente ohne "Distinguished Fields"
vTestString = xpath(msgSapMtnDebiResp,
"string(/*[local-name()='YY_MAINTAIN_DEBI_Response' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003']/*[local-name()='RETURN' and namespace-uri()='']/*[local-name()='CODE' and namespace-uri()=''])");
den richtigen XPath bekommt man am schnellesten in den man im BizTalk-Schema-Editor das entsprechende Element anklickt und im Eigenschaften-Editor den Wert aus dem Attribut "Instance Path" kopiert
Verwendung von Namespace-Manager I
xmlDocument = msgEai;
System.Diagnostics.Trace.WriteLine("Message: " + xmlDocument.InnerXml);
nsmgr = new System.Xml.XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace("ns0", "http://EsriDe.EAI.EsriDeSchema");
xmlNode = xmlDocument.SelectSingleNode("//ns0:EAI/Company", nsmgr);
isCompany = (xmlNode != null);
xmlNode = xmlDocument.SelectSingleNode("//ns0:EAI/Contact", nsmgr);
isContact = (xmlNode != null);
Verwendung von Namespace-Manager II
vXmlDocument = msgEai;
System.Diagnostics.Trace.WriteLine("tMessage='" + vXmlDocument.OuterXml + "'");
vNsMgr.XmlNamespaceManager = new System.Xml.XmlNamespaceManager(vXmlDocument.NameTable);
vNsMgr.XmlNamespaceManager.AddNamespace("ns0", "http://EsriDe.EAI.EsriDeSchema");
vXmlNode.XmlNode = vXmlDocument.SelectSingleNode("//ns0:EAI/Company/Unternehmenstypen", vNsMgr.XmlNamespaceManager);
System.Diagnostics.Trace.WriteLine("tNode='" + vXmlNode.XmlNode.OuterXml + "'");
in diesem Beispiel kommt darüberhinaus noch die aufgepeppten (serialisierbaren) Varianten von XmlNode und XmlNamespaceManager zum Einsatz.
Verwendung von Namespace-Manager III
hier mal eine Variante mit Zuweisungen
vXmlDocument = msgSapMtnDebiReq;
vNsMgr.XmlNamespaceManager = new System.Xml.XmlNamespaceManager(vXmlDocument.NameTable);
vNsMgr.XmlNamespaceManager.AddNamespace("ns0", "http://schemas.microsoft.com/BizTalk/2003");
xpath(msgSapMtnDebiReq, "/ns0:YY_MAINTAIN_DEBI_Request/KTOKD", vNsMgr.XmlNamespaceManager) = msgPivotalKtoInfo.Debitor;
.NET Klassen
falls man mal etwas mehr Logik unterbringen möchte
msgPivotalKtoInfo.Debitor = vMapCrmUnternehmensTypen2SapKontogruppen.Map2Debitor(vXmlNode.XmlNode);
msgPivotalKtoInfo.Kreditor = vMapCrmUnternehmensTypen2SapKontogruppen.Map2Kreditor(vXmlNode.XmlNode);
wobei die Klasse MapCrmUnternehmensTypen2SapKontogruppen über die 2 Methoden Map2Debitor und Map2Kreditor verfügt
public class MapCrmUnternehmensTypen2SapKontogruppen
{
public string Map2Debitor(XmlNode xn)
{..}
public string Map2Kreditor(XmlNode xn)
{
StringCollection sc = new StringCollection();
XmlNodeList xnl = xn.ChildNodes;
foreach (XmlNode xn2 in xnl)
sc.Add(xn2.InnerText);
if (sc.Contains("8"))
return "KRED";
else
return string.Empty;
}