Search code examples
c#xmlbiztalkbiztalk-pipelines

Add namespace and alias to existing xml


I am using the code below to change a namespace in an existing XML message in a BizTalk pipeline component. This works but how would I add a namespace alias to the document as well.

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);

Solution

  • You can simply add a declaration attribute to the root. Take this example:

    <Root>
        <Child>Value</Child>
    </Root>
    

    If you run this code:

    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));
    

    You'll get this result:

    <ex:Root xmlns:ex="http://www.example.com/">
      <ex:Child>Value</ex:Child>
    </ex:Root>
    

    See this fiddle for a demo.