【问题标题】:Add namespace and alias to existing xml将命名空间和别名添加到现有 xml
【发布时间】:2017-06-30 00:48:14
【问题描述】:

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

【问题讨论】:

  • 你检查过这个answer吗?也许XmlSerializerNamespaces 可以胜任。
  • 您是否尝试过使用 ESB 添加和删除命名空间管道组件? msdn.microsoft.com/en-us/library/ee250047(v=bts.10).aspx
  • 等等!你为什么要这样做?我问是因为 HL7 消息没有命名空间是不寻常的。为了清楚起见,还有更多“正确”的方法可以做到这一点。
  • 我必须这样做,因为现有的命名空间和 messageType 已经在应用程序中使用。更改命名空间似乎是一个简单的解决方案,但我的地图遇到了很多问题,并为此发布了另一个线程。我确定有更好的方法,但我将尝试添加别名,如下所示,看看在我从头开始之前是否可行
  • @David 哦...嗯...那么...对不起,是的,有更好的方法来处理这个问题。事实上,有正确的方法来处理这个问题。我会将其发布为答案。

标签: c# xml biztalk biztalk-pipelines


【解决方案1】:

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

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

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

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

【讨论】:

  • 这太好了,我知道一定有更好的方法。我对解决此问题的方法进行了很多搜索,但从未想出这些链接。谢谢!
【解决方案2】:

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

<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 以获取演示。

【讨论】:

  • 我现在试试这个
  • 对于未来的读者,因为这是一个 BizTalk 应用程序此答案不正确。 1) 消息类型冲突应由 XmlDisassembler 设置处理 2) XmlDocument/XDocument 的使用应在管道组件中使用未通过审查。我不会投反对票,因为 Charles Mager 不是 BizTalk 开发人员。 @大卫
  • @Johns-305 我想这取决于你如何看待它。这是正确的,因为它给出了所提出的具体问题的答案。我无法评论整体方法是否正确。
  • @CharlesMager 好吧,我非常指出这是不正确的,因为这是解决在 BizTalk 应用程序中问题的错误方法。 WinForm/ASP/Console,它是 100% 正确的。它只是不适用于 BizTalk 应用程序,因为 BizTalk 有办法处理这个确切的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-09-21
  • 1970-01-01
  • 2012-12-26
  • 2018-10-04
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多