2017-06-30 1 views
0

Ich verwende den folgenden Code, um einen Namespace in einer vorhandenen XML-Nachricht in einer BizTalk-Pipeline-Komponente zu ändern. Das funktioniert, aber wie würde ich dem Dokument auch einen Namespace-Alias ​​hinzufügen?Hinzufügen von Namespace und Alias ​​zu vorhandenem XML

XNamespace toNs = "http://hl7.org/fhir/Encounters"; 

XElement doc = XElement.Parse(xmlIn); 

doc.DescendantsAndSelf().Attributes().Where(a => a.IsNamespaceDeclaration).Remove(); 

var ele = doc.DescendantsAndSelf(); 

foreach (var el in ele) 
    el.Name = toNs + el.Name.LocalName; 

return new XDocument(doc); 
+0

Haben Sie das [Antwort] (https://StackOverflow.com/questions/2339782/xml-Serialization-and-Namespace-prefixes) überprüft? Vielleicht kann 'XmlSerializerNamespaces' die Aufgabe erledigen. – andiblas

+0

Haben Sie versucht, mit Die ESB Hinzufügen und Entfernen von Namespace Pipeline-Komponenten? https://msdn.microsoft.com/en-us/library/ee250047(v=bts.10).aspx – Dijkgraaf

+0

** HALTEN SIE ON! ** Warum machst du das? Ich fragen Sie, da es für eine HL7-Nachricht ungewöhnlich ist, dass sie noch keinen Namespace hat, und aus Gründen der Klarheit gibt es mehr "richtige" Wege, dies zu erreichen. –

Antwort

1

Sie können einfach ein Deklarationsattribut zum Stamm hinzufügen. Nehmen Sie dieses Beispiel:

<Root> 
    <Child>Value</Child> 
</Root> 

Wenn Sie diesen Code ausführen:

var root = XElement.Parse(xml); 

XNamespace ns = "http://www.example.com/"; 

foreach (var element in root.DescendantsAndSelf()) 
{ 
    element.Name = ns + element.Name.LocalName; 
} 

root.Add(new XAttribute(XNamespace.Xmlns + "ex", ns)); 

Sie werden dieses Ergebnis erhalten:

<ex:Root xmlns:ex="http://www.example.com/"> 
    <ex:Child>Value</ex:Child> 
</ex:Root> 

Siehe this fiddle für eine Demo.

+0

Ich werde dies jetzt versuchen – David

+0

Für zukünftige Leser, * da dies eine BizTalk App * ist ** ist diese Antwort nicht korrekt **. 1) Nachrichten Typ Kollisionen sollten von XmlDisassembler Einstellungen behandelt werden 2) XmlDocument/XDocument Verwendung sollte Überprüfung mit in einer Pipeline-Komponente verwendet fehlschlagen. Ich werde nicht Downvote, da Charles Mager kein BizTalk-Entwickler ist. @ David –

+0

@ Johns-305 Ich nehme an, es hängt davon ab, wie Sie es betrachten. Es ist richtig, dass es die Antwort auf die spezifische Frage gibt. Ich kann nicht sagen, ob der Gesamtansatz richtig ist. –

4

Jetzt, da wir den Grund dafür kennen (doppelte MessageTypes), ist die richtige BizTalk-Methode, um dies zu handhaben, benutzerdefinierte Pipelines mit konfigurierten XmlDisassembler-Komponenten bereitzustellen. Jeder sollte das trotzdem machen.

Bitte auf diese TechNet Wiki Artikel, die genau dieses Szenario beschreibt und wie es lösen: BizTalk: Improve Deployment and Tracking by Always Creating Custom Pipelines

Wenn Sie unbedingt den Inhalt ändern müssen, die richtige Art und Weise in einer Pipeline-Komponente ist die XmlTranslatorStream zu verwenden. Dies ist anstelle von XmlDocument oder XDocument.

Aus einer BizTalk-Perspektive die markierte Antwort ist nicht korrekt. Es tut uns leid. :(

+0

Das ist großartig, ich wusste, dass es einen besseren Weg geben muss. Ich habe ziemlich viel nach Wegen gesucht, um dieses Problem zu lösen, habe aber nie diese Links gefunden. Vielen Dank! – David

Verwandte Themen