将命名空间和别名添加到现有xml

时间:2017-06-30 00:48:15

标签: c# xml biztalk biztalk-pipelines

我使用下面的代码更改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);

2 个答案:

答案 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了解演示。