Cómo convertir DICOM en XML y Back usando DicomXmlSerializer

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.Medical

Paso 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 JSON

Recomendaciones de caso

ScenarioEl formato recomendado
Nuevos servicios webJSON
Integración del PACSXML
HL7 MédicoXML
Los frontendos JavaScriptJSON
Transformaciones XSLTXML
NoSQL bases de datosJSON
Validación del esquemaXML

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.

 Español