Have you ever worked with Microsoft.BizTalk.ParsingEngine.FFReader object to parse Flat-File contant in Pipeline component? be aware not to use ReadToFollowing() method within this object.
I've wrote a custom PPLC to parse and modify Flat File. Hers the Code snippet:
//Get the messge stream
Stream inStream = inMsg.BodyPart.GetOriginalDataStream();
//Get FFDocumentSpec and parse content from FF to XML with FF Anotation
IFFDocumentSpec docSpec = (IFFDocumentSpec)context.GetDocumentSpecByName("MyPoject.Schemas.MySchema_FF");
//Prepare Stream reader
StreamReader streamReader = new StreamReader(inStream);
Microsoft.BizTalk.ParsingEngine.DataReader dataReader = new Microsoft.BizTalk.ParsingEngine.DataReader(streamReader);
//start parsing the message
reader = (Microsoft.BizTalk.ParsingEngine.FFReader)docSpec.Parse(dataReader);
//start reading the message
reader.ReadToFollowing("nodeName", "http://node.Namespace");
The FFReader class is derived from System.Xml.XmlReader I read the content of the stream with the System.Xml.XmlReader.ReadToFollowing(String) method. and was very surprised to run into some NullReferenceException runtime exception. The Exception was thrown at ReadToFollowing() method.
After checking all the member initialization, I decided to search a little deeper inside the framework.
I find out that FFReader doesn't implements it's own ReadToFollowing() method so, the method is executing as in the base XmlReader Class.
The FFReader doesn't initializing the 'TableName' object and this member is remaining Null.
Unfortunatlly, the base XmlReader uses this object in the ReadToFollowing() method so it was cousing NullReferenceException.
Conclusion: manually create your own ReadToFollowing() method and don't use the one under FFReader.
public bool ReadToFollowing(string localName, string namespaceURI, FFReader reader)
{
while (reader.Read())
{
if (reader.Name.Equals(localName) && reader.NamespaceURI.Equals(namespaceURI))
return true;
}
return false;
}