Möglichkeiten des Message-Handlings in Orchestrations

Für das Handling von Messages in Orchstrations gibt es verschiedene Möglichkeiten. Eine gute Beschreibung ist von Matt Meleski " Constructing BizTalk 2004 XM...

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;
    }