Problem
Description

==================

When using BizTalk
WCF-SQL adapter to retrieve data from

SQL, there is a known issue that a blank namespace may be generated when a FOR

XML clause stored procedure is used. For example, the empty xmlns=""
on FTP_KC_SERIAL_NO_HEAD in the

following XML instance.

<?xml version="1.0"
encoding="utf-8"

?>

- <Root
xmlns="http://TestEDI.SP_GetDataFromFTPKCSerialNo">

-
<FTP_KC_SERIAL_NO_HEAD xmlns="">

<INV_NO>30111112173</INV_NO>

<ImportDate>8/16/2011
3:05:43

PM</ImportDate>

<Status>processing</Status>

<SendDate>8/16/2011
3:35:21

PM</SendDate>

<FROM_DUNS>12490306</FROM_DUNS>

Problem
Analysis

================

There are
various of approaches to resolve the issue, a

simple workaround may be to set “FORM = UNQUALIFIED” on the message schema to

ignore it.

However
sometimes this kind of blank namespaces will cause

errors within map. In this case, you may consider writing a simple pipeline

component to completely remove it from the XML message body.

Problem
Resolution

=================

Sample code
snippet of pipeline component to remove blank

xml namespaces.

#region
IComponent Members

///
<summary>

/// This method
Executes

the pipeline component

///
</summary>

/// <param
name="pContext">pipelinecontext Interface</param>

/// <param
name="pInMsg">the incoming XLang Message on which we have to
operate</param>

///
<returns></returns>

public
IBaseMessage Execute(IPipelineContext

pContext, IBaseMessage pInMsg)

{



//Validate parameters



if (pContext == null)

throw new ArgumentNullException("pContext");



if (pInMsg == null)

throw new ArgumentNullException("pInMsg");



this.pipelineContext = pContext;



this.baseMessage = pInMsg;



Stream outStream = null;



string partName;



for (int i = 0;

i < baseMessage.PartCount; i++)



{



partName = null;



IBaseMessagePart part = baseMessage.GetPartByIndex(i, out

partName);



RemoveBlankNamespace(part.GetOriginalDataStream(), out

outStream);



outStream.Seek(0, SeekOrigin.Begin);



part.Data = outStream;



}



return baseMessage;

}



#endregion

#region
Private-Methods

///
<summary>

/// This method
remove

blank xml namespace attribute: xmlns="" from input message body

stream.

///
</summary>

/// <param
name="xmlData">the actual stream of the data needs to be
manipulated</param>

/// <param
name="modifiedXmlData">the modifiedStream is passed as a out
parameter</param>

///
<returns></returns>

private void

RemoveBlankNamespace(Stream xmlData, out Stream

modifiedXmlData)

{



modifiedXmlData = new MemoryStream();



StreamReader reader = new StreamReader(xmlData);



String messageBody = reader.ReadToEnd();



messageBody = messageBody.Replace("

xmlns=\"\"","");



byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(messageBody);



modifiedXmlData.Write(messageBytes,

0, messageBytes.Length);

}



#endregion

More
Information

=================

A relevant
forum thread:

Namespace
appear in the child node when using FOR XML output

in BizTalk server 2009 and the map fails

http://social.msdn.microsoft.com/Forums/is/biztalkr2adapters/thread/f996af8b-1056-4a62-8628-d3845fa36e96

 

Best regards,

WenJun Zhang