Validating CDA XML with C#

Validating CDA documents in C# seems to be a bit tricky… At first, I started out just copying the infrastructure and processable schemas to a project and creating the code to use those schemas to validate. Unfortunately, I kept getting errors like “Missing complexType ‘II’ used in restriction base”. The II type is defined in datatypes-base, and the element it was error out on was the POCD_MT000040.InfrastructureRoot.typeId complex type.

I still have no idea what the issue is here… The schemas validate without problem in Eclipse, Oxygen and even XMLSpy.

I ended up having to flatten the schemas into a single file. I believe the issue has something to do with namespaces that I don’t fully understand; so if anyone out here has the answer, please comment.

After flattening the structure of the schemas into a single file, it started validating without problem using the following code:

public static bool ValidateCDA(string content) 
{ 
List<string> validationErrors = new List<string>();

byte[] contentBytes = ASCIIEncoding.ASCII.GetBytes(content); 
using (MemoryStream contentStream = new MemoryStream(contentBytes)) 
{ 
XmlValidatingReader validationReader = new XmlValidatingReader(new XmlTextReader(contentStream)); 
validationReader.XmlResolver = new XmlUrlResolver(); 
validationReader.ValidationType = ValidationType.Schema;

// Add CDA xsd 
Stream cdaStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("My.Namespace.CDA.xsd"); 
XmlReader cdaReader = XmlReader.Create(cdaStream); 
validationReader.Schemas.Add("urn:hl7-org:v3", cdaReader);

validationReader.ValidationEventHandler += new ValidationEventHandler( 
delegate(object sender, ValidationEventArgs e) 
{ 
validationErrors.Add(e.Message); 
});

while (validationReader.Read()) { } 
}

return validationErrors.Count == 0; 
}

Leave a Reply

Your email address will not be published.

Humanity Verification *Captcha loading...