Cómo convertir DICOM en XML y Back usando DicomXmlSerializer
Este tutorial demuestra cómo convertir los archivos de DICOM en formato XML y deserializar XML de vuelta a DicOM utilizando C#. El formato de XML es preferido para la integración con los sistemas de herencia, los flujos de trabajo de HL7 y los entornos en los que se establece bien la herramienta XML.
Cómo usar XML sobre JSON
- Integración legal *:- Los medios y sistemas existentes a menudo esperan el formato XML.
H7 Compatibilidad:- Los sistemas de salud que utilizan HL7 v2/v3 normalmente trabajan con XML.
Taller de XML:- Organizaciones con transformaciones XSLT y consultas XPath establecidas.
- Validación del programa *:- Los esquemas XML proporcionan capacidades de validación estrictas.
Requisitos: Preparación del medio ambiente
- Instalar Visual Studio o cualquier compatible .NET IDE.
- Crea un nuevo proyecto de aplicación .NET 8 consola.
- Instalar Aspose.Medical desde el NuGet Package Manager.
Guía paso a paso para convertir DICOM en XML
Paso 1: Instalar Aspose.Medical
Añade la biblioteca de Aspose.Medical a su proyecto utilizando NuGet.
Install-Package Aspose.MedicalPaso 2: Incluir los espacios de nombre necesarios
Añade las referencias a los espacios de nombre requeridos en su código.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;Paso 3: Cargar el archivo DICOM
Cargue el archivo DICOM que desea convertir.
DicomFile dcm = DicomFile.Open("patient_scan.dcm");Paso 4: Serializar a XML
Utilice el DicomXmlSerializer.Serialize Convertir en XML.
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);Paso 5: Salva la salida de XML
Salva el XML a un archivo para almacenamiento o transmisión.
File.WriteAllText("patient_scan.xml", xml);Paso 6: Deserializar XML de vuelta a Dataset
Para convertir XML de nuevo en DICOM, utilice el Deserialize El método.
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);Exemplo de código completo: Conversión de DICOM a XML
Aquí hay un ejemplo completo de la conversión de DICOM a XML:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
// Load DICOM file
DicomFile dcm = DicomFile.Open("patient_scan.dcm");
// Convert to XML
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);
// Save to file
File.WriteAllText("patient_scan.xml", xml);
Console.WriteLine("DICOM converted to XML successfully!");
Console.WriteLine($"Output saved to: patient_scan.xml");Exemplos de código completo: Conversión XML a DICOM
Aquí hay un ejemplo completo de la conversión de XML en DICOM:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
// Read XML from file
string xml = File.ReadAllText("patient_scan.xml");
// Deserialize to Dataset
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);
if (dataset != null)
{
// Create DicomFile from Dataset
DicomFile dcm = new DicomFile(dataset);
// Save as DICOM file
dcm.Save("reconstructed.dcm");
Console.WriteLine("XML converted back to DICOM successfully!");
}
else
{
Console.WriteLine("Failed to deserialize XML.");
}Exemplos de ruta: DICOM → XML → DIKOM
Conversión redonda completa que demuestra la integridad de los datos:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
// Load original DICOM file
DicomFile original = DicomFile.Open("original_scan.dcm");
Console.WriteLine("Original DICOM loaded.");
// Convert to XML
string xml = DicomXmlSerializer.Serialize(original.Dataset);
Console.WriteLine($"Converted to XML ({xml.Length} characters).");
// Save XML (for transmission or storage)
File.WriteAllText("intermediate.xml", xml);
// Later: Deserialize XML back to Dataset
string loadedXml = File.ReadAllText("intermediate.xml");
Dataset? reconstructedDataset = DicomXmlSerializer.Deserialize(loadedXml);
if (reconstructedDataset != null)
{
// Create new DicomFile
DicomFile reconstructed = new DicomFile(reconstructedDataset);
reconstructed.Save("reconstructed_scan.dcm");
Console.WriteLine("Round-trip complete: DICOM → XML → DICOM");
}Exemplos de la estructura de salida XML
La salida XML representa las etiquetas DICOM en un formato estructurado:
<?xml version="1.0" encoding="utf-8"?>
<NativeDicomModel>
<DicomAttribute tag="00080005" vr="CS" keyword="SpecificCharacterSet">
<Value number="1">ISO_IR 100</Value>
</DicomAttribute>
<DicomAttribute tag="00080020" vr="DA" keyword="StudyDate">
<Value number="1">20240115</Value>
</DicomAttribute>
<DicomAttribute tag="00100010" vr="PN" keyword="PatientName">
<PersonName number="1">
<Alphabetic>
<FamilyName>DOE</FamilyName>
<GivenName>JOHN</GivenName>
</Alphabetic>
</PersonName>
</DicomAttribute>
<DicomAttribute tag="00100020" vr="LO" keyword="PatientID">
<Value number="1">12345</Value>
</DicomAttribute>
</NativeDicomModel>Comparación de JSON y XML
Tamaño Comparativa
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
DicomFile dcm = DicomFile.Open("sample.dcm");
string json = DicomJsonSerializer.Serialize(dcm);
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);
Console.WriteLine($"JSON size: {json.Length:N0} characters");
Console.WriteLine($"XML size: {xml.Length:N0} characters");
// XML is typically 20-40% larger than JSONRecomendaciones de caso
| Scenario | El formato recomendado |
|---|---|
| Nuevos servicios web | JSON |
| Integración del PACS | XML |
| HL7 Médico | XML |
| Los frontendos JavaScript | JSON |
| Transformaciones XSLT | XML |
| NoSQL bases de datos | JSON |
| Validación del esquema | XML |
Integración con Sistemas de Legacy
Exemplos de integración con herencia middleware:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
using System.Net.Http;
using System.Text;
DicomFile dcm = DicomFile.Open("patient_scan.dcm");
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);
// Send to legacy SOAP service
using HttpClient client = new();
var content = new StringContent(xml, Encoding.UTF8, "application/xml");
HttpResponseMessage response = await client.PostAsync(
"http://legacy-pacs/dicom/import",
content
);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("XML successfully sent to legacy system!");
}Troubleshooting
Tratamiento de XML Invalido
Desertificación en try-catch para el manejo de errores:
try
{
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);
if (dataset == null)
{
Console.WriteLine("Deserialization returned null.");
}
}
catch (System.Xml.XmlException ex)
{
Console.WriteLine($"XML parsing error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Deserialization error: {ex.Message}");
}Personajes que codifican problemas
Asegurar la correcta codificación al leer/escribir archivos XML:
// Write with explicit encoding
using (StreamWriter writer = new StreamWriter("output.xml", false, Encoding.UTF8))
{
writer.Write(xml);
}
// Read with explicit encoding
using (StreamReader reader = new StreamReader("input.xml", Encoding.UTF8))
{
string xml = reader.ReadToEnd();
}Gestión de grandes archivos
Para los archivos DICOM muy grandes, considere streaming:
using (FileStream fs = File.Create("large_output.xml"))
using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8))
{
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);
writer.Write(xml);
}Información adicional
- El formato XML proporciona una mejor lectura humana con la indentación adecuada.
- XML es más verbosa que JSON, lo que hace que los archivos sean más grandes.
- Considere la composición para almacenar o transmitir grandes archivos XML.
- Tanto JSON como XML soportan los mismos tipos y estructuras de datos de DICOM.
Conclusión
Este tutorial ha demostrado cómo convertir los archivos de DICOM en formato XML y deserializar XML de vuelta a Dicom en C# utilizando Aspose.Medical. la serializacin de XML es esencial para la integración con los sistemas de salud heredados y los entornos que se basan en la herramienta y flujos de trabajo XML.