Marko Apfel - Afghanistan/Belgium/Germany

Management, Architecture, Programming, QA, Coach, GIS, EAI

  Home  |   Contact  |   Syndication    |   Login
  187 Posts | 2 Stories | 201 Comments | 4 Trackbacks

News



Twitter | LinkedIn | Xing

Article Categories

Archives

Image Galleries

BizTalk

C#

Enterprise Library

SAP

SQL Server

Technologie

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;
    }
posted on Wednesday, February 7, 2007 2:30 PM