0

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

2 回答 2

4

既然我们知道了这种情况的原因(重复的 MessageTypes),正确的 BizTalk 处理方法是使用配置的 XmlDisassembler 组件部署自定义管道。无论如何,每个人都应该这样做。

请参阅此 TechNet Wiki 文章,该文章描述了这种确切的情况以及如何解决它:BizTalk:通过始终创建自定义管道来改进部署和跟踪

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

从 BizTalk 的角度来看,标记的 Answer is not correct。对不起。:(

于 2017-06-30T20:14:09.140 回答
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>

请参阅此小提琴以进行演示。

于 2017-06-30T08:38:41.747 回答