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

Add namespace and alias to existing xml

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

您可以简单地向根添加一个声明属性。举个例子:

<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

现在我们知道了这个问题的原因(重复的 MessageType),处理这个问题的正确 BizTalk 方法是部署带有配置的 XmlDisassembler 组件的自定义管道。无论如何,每个人都应该这样做。

请参阅这篇 TechNet Wiki 文章,其中描述了这种情况以及解决方法:BizTalk: Improve Deployment and Tracking by Always Creating Custom Pipelines

如果您绝对必须修改内容,在管道组件中正确的方法是使用XmlTranslatorStream。这不是 XmlDocument 或 XDocument。

从 BizTalk 的角度来看,标记的答案不正确。对不起。 :(