2017-06-29 4 views
0

Ich kann meine BizTalk-Map nicht mit Nachrichten nach Envelope debatching arbeiten. Die Karte scheint ein Namespacepräfix zu erfordern, aber die debatched Nachricht hat kein Präfix. Wenn ich dem Stamm ein Präfix hinzufüge, wie diese <ns0:Encounter xmlns:ns0="http://hl7.org/fhir/Encounters"> dann funktioniert die Karte richtig, wenn ich Testkarte in Visual Studio verwende. Ohne das Präfix bekomme ich immer noch eine Ausgabe von der Map, aber nur Konstanten werden dem Zielschema zugeordnet, nichts wird aus dem Quellschema gemappt.BizTalk-Karte funktioniert nicht, wenn das Namespace-Präfix fehlt

bekomme ich folgende Fehlermeldung für jedes Element zugeordnet

"error btm1044: Input validation error: The 'value' attribute is not declared."

Ich habe versucht, den Wert von ElementFormDefault- von unqualifizierten an qualifizierte ändern, wie auf einem separaten Posten vorgeschlagen, aber noch kein Glück.

Nach Umschlag Debatching ich am Ende mit dem folgenden XML. Beachten Sie, dass kein Namespacepräfix vorhanden ist. Wenn ich den Sendeport stoppe und die debatched Nachrichten ansehe, ist der MessageType http://hl7.org/fhir/Encounters#Encounter.

<?xml version="1.0" encoding="utf-8"?> 
<Encounter xmlns="http://hl7.org/fhir/Encounters"> 
    <id value="ac34e2c2-6080-4c46-9ec5-d7340a7c4177" /> 
    <extension url="https://api-foo.org/documents/fhir/extensions/encounter-facility"> 
     <valueString value="foo" /> 
    </extension> 
    <extension url="https://api-foo.org/documents/fhir/extensions/encounter-service"> 
     <valueString value="fooo" />....... 

Mein Schema sieht wie folgt aus

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns="http://hl7.org/fhir/Encounters" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://hl7.org/fhir/Encounters" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Encounter"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="id"> 
      <xs:complexType> 
      <xs:attribute name="value" type="xs:string" use="required" /> 
      </xs:complexType> 
     </xs:element> 
     <xs:element maxOccurs="unbounded" name="extension"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="valueInteger"> 
       <xs:complexType> 
        <xs:attribute name="value" type="xs:unsignedByte" use="required" /> 
       </xs:complexType> 
       </xs:element> 
       <xs:element minOccurs="0" name="valueString"> 
       <xs:complexType> 
        <xs:attribute name="value" type="xs:string" use="required" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="url" type="xs:string" use="required" /> 
      </xs:complexType> 
     </xs:element> ............ 

Gibt es eine Möglichkeit die Karte/schema zu erhalten mit der Nachricht zu arbeiten, wie ist, oder eine Möglichkeit, die debatched Nachricht zu erhalten das Präfix zu haben.

Ich habe auch eine benutzerdefinierte Pipeline-Komponente, um den Namespace der eingehenden Nachricht vor dem debatching zu ändern. Ich bin nicht sicher, ob dies das Problem verursachen könnte, dass der Code unten ist.

public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg) 
    { 
     if (Enabled) 
     { 
      try 
      { 
       IBaseMessagePart bodyPart = inmsg.BodyPart; 

       if (bodyPart != null) 
       { 
        string json; 

        using (Stream originalDataStream = bodyPart.GetOriginalDataStream()) 
        { 
         if (originalDataStream != null) 
         { 
          //Read the json message 
          using (TextReader tr = new StreamReader(originalDataStream)) 
          { 
           json = tr.ReadToEnd(); 
          } 

          //Use FHIR-NET-API to create a FHIR resource from the json 
          Hl7.Fhir.Serialization.ResourceReader resourceReader = new Hl7.Fhir.Serialization.ResourceReader(FhirJsonParser.CreateFhirReader(json), ParserSettings.Default); 

          //switch the namespace 
          var doc = XElement.Parse(Hl7.Fhir.Serialization.FhirSerializer.SerializeToXml(resourceReader.Deserialize())); 

          XNamespace toNs = Namespace; 
          doc.DescendantsAndSelf().Attributes().Where(a => a.IsNamespaceDeclaration).Remove(); 
          var ele = doc.DescendantsAndSelf(); 
          foreach (var el in ele) 
           el.Name = toNs + el.Name.LocalName; 

          //Create the new BizTalk message 
          var memoryStream = new MemoryStream(); 
          doc.Save(memoryStream); 
          // memoryStream.Write(resourceXmlBytes, 0, resourceXmlBytes.Length); 
          memoryStream.Position = 0; 
          inmsg.BodyPart.Data = memoryStream; 
         } 
        } 
       } 

       return inmsg; 
      } 
      catch (Exception e) 
      { 
       GenericEventLogger.LogEvent(
       ExceptionSource, 
       String.Format("An exception [{0}] occured in [{1}()]. \n\nMessage: \n{2} \n\nStack Trace: \n{3}", 
           e.GetType().Name, 
           System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName, 
           e.Message, 
           e.StackTrace), 
       EventLogEntryType.Error, 
       999); 
       throw; 
      } 
     } 

     return inmsg; 
    } 

Hier ist der Umschlag Schema

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns="http://hl7.org/fhir/Encounters" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://hl7.org/fhir/Encounters" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:annotation> 
    <xs:appinfo> 
     <b:schemaInfo is_envelope="yes" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" /> 
    </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="Bundle"> 
    <xs:annotation> 
     <xs:appinfo> 
     <b:recordInfo body_xpath="/*[local-name()='Bundle' and namespace-uri()='http://hl7.org/fhir/Encounters']/*[local-name()='entry' and namespace-uri()='http://hl7.org/fhir/Encounters']/*[local-name()='resource' and namespace-uri()='http://hl7.org/fhir/Encounters']" /> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="total"> 
      <xs:complexType> 
      <xs:attribute name="value" type="xs:unsignedByte" use="required" /> 
      </xs:complexType> 
     </xs:element> 
     <xs:element maxOccurs="unbounded" name="entry"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="resource"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="Encounter"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:any /> 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

In welchem ​​Teil der Empfangspipeline ist Ihre Namespace-Pipeline-Komponente? Mit welcher Methode debatchest du die Nachricht? Mit einem Umschlagschema? (Wenn ja, zeigen Sie das Schema dafür an) Wenn Sie die Karte vom Port nehmen, welcher Nachrichtentyp befindet sich im Kontext der Nachricht? Haben Sie auch einen XML-Validator in der Pipeline? (Wie sieht dieser Fehler aus und nicht eine Karte, oder ist das der Fehler, den Sie von Visual Studio beim Testen der Karte erhalten?) – Dijkgraaf

+0

Verwenden Sie den BizTalk HL7 Disassembler? –

+0

In der Pipelinekomponente verwende ich eine HL7 FHIR-Bibliothek, um den eingehenden JSON in XML zu konvertieren und dann den Namespace in der Execute-Methode zu ändern. Die Pipeline-Komponente befindet sich im Decode-Teil der Pipeline. Die standardmäßige XML-Disassembler-Komponente befindet sich im Disassembly-Teil der Pipeline. Keine anderen Komponenten werden verwendet. Ich werde die Post mit dem Umschlagschema und anderen angeforderten Informationen aktualisieren. – David

Antwort

1

Da Sie die JSON-Darstellungen von Fhir verwenden, sollte die erste Frage sein, brauchen Sie auch XML-Namespaces zu verwenden.

Wenn ich mit nativem JSON-Inhalt in BizTalk arbeite, ist meine Empfehlung, den leeren Namespace in allen Xml-Verarbeitung zu verwenden.

Sie in diesem Wiki Artikel, um weitere Informationen zu verweisen: BizTalk: Simplify BizTalk Dev by Using the Empty Namespace

+0

Danke @ Johns-305 Ich werde mir dies und deine Antwort auf meinen anderen Thread ansehen und die Designänderungen vornehmen, um dies richtig zu machen. – David

+0

Für jeden anderen Leser gibt es mehr zu diesem Thema in diesem Thread [link] (https://stackoverflow.com/questions/44837027/add-namespace-and-alias-to-existing-xml).Wo @ Johns-305 liefert zusätzliche Links zu Lösungen. – David

+0

Ich wechselte zu leeren Namespaces auf meinem Umschlag und msg Schema und spezifiziere die Schemas im XmlDisassembler wie im obigen Link beschrieben und meine Anwendung funktioniert nun wie erwartet. Danke nochmal für die Hilfe. @ Johns-305 - Der Artikel erwähnt, dass "Die Visual Studio-Lösung für den Community-Namespace entfernen" wird bald ". Ist diese VS-Lösung zum Download verfügbar? – David

Verwandte Themen