2017-06-30 234 views
0

我正在使用下面的代碼來更改BizTalk管道組件中現有XML消息中的名稱空間。這有效,但我怎麼會添加一個命名空間別名到文檔。將名稱空間和別名添加到現有的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

你檢查了這個[答案](https://stackoverflow.com/questions/2339782/xml-serialization-and-namespace-prefixes)?也許'XmlSerializerNamespaces'可以完成這項工作 – andiblas

+0

你是否嘗試過使用ESB添加和刪除命名空間管道組件?https://msdn.microsoft.com/zh-cn/library/ee250047(v=bts.10).aspx – Dijkgraaf

+0

**保持打開!**爲什麼要這樣做?I問一個問題,因爲HL7消息中不存在名稱空間是非常不尋常的,爲了清楚起見,還有更多'正確'的方法可以實現這一點 –

回答

1

您可以簡單地將聲明屬性添加到根。如果你運行這段代碼

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

:就拿這個例子

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

你會得到這樣的結果:

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

的演示中看到this fiddle

+0

我現在試試這個 – David

+0

對於未來的讀者,*因爲這是一個BizTalk應用程序*,**這個答案不正確**。 1)消息類型衝突應該由XmlDisassembler設置來處理2)XmlDocument/XDocument的使用應該會在管道組件中使用失敗。自從Charles Mager不是BizTalk開發者以來,我不會使用Downvote。 @David –

+0

@ Johns-305我想這取決於你如何看待它。這是正確的,它給出了具體問題的答案。我無法評論整體方法是否正確。 –

4

現在我們知道此原因(重複的MessageTypes),正確的BizTalk處理方法是使用配置的XmlDisassembler組件部署自定義管道。無論如何,每個人都應該這樣做。

請參閱本的TechNet wiki文章描述該確切的情況,以及如何解決它:BizTalk: Improve Deployment and Tracking by Always Creating Custom Pipelines

如果你絕對必須修改的內容,在管道組件的正確方法是使用XmlTranslatorStream。這不是XmlDocument或XDocument。

從BizTalk的角度來看,標記的回答不正確。抱歉。 :(

+0

這很棒,我知道必須有更好的方法。我在解決這個問題的方法上做了很多努力,但從來沒有提出這些鏈接。謝謝! – David

相關問題