我使用下面的代码更改BizTalk管道组件中现有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 :(得分:4)
现在我们知道了这个(重复的MessageTypes)的原因,正确的BizTalk方法是使用配置的XmlDisassembler组件部署自定义管道。无论如何,每个人都应该这样做。
请参阅此TechNet Wiki文章,其中介绍了此确切方案以及解决方法:BizTalk: Improve Deployment and Tracking by Always Creating Custom Pipelines
如果您绝对必须修改内容,则管道组件中的正确方法是使用XmlTranslatorStream。这不是XmlDocument或XDocument。
从BizTalk的角度来看,标记的答案不正确。抱歉。 :(
答案 1 :(得分: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了解演示。