2017-06-30 130 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

相关问题