Come convertire DICOM in XML e Back utilizzando DicomXmlSerializer

Come convertire DICOM in XML e Back utilizzando DicomXmlSerializer

Questo tutorial dimostra come convertire i file DICOM in formato XML e deserializzare XML indietro a DicOM utilizzando C#. Il formato XML è preferito per l’integrazione con i sistemi di eredità, i flussi di lavoro HL7 e gli ambienti in cui lo strumento XML è ben stabilito.

Quando utilizzare XML su JSON

  • • Integrazione legale *:- I middleware esistenti e i sistemi spesso aspettano il formato XML.

  • ** Compatibilità HL7**:- I sistemi di assistenza sanitaria che utilizzano HL7 v2/v3 lavorano tipicamente con XML.

    • Il testo di XML Tooling:- Organizzazioni con stabilite trasformazioni XSLT e domande XPath.
    • Validazione del programma *:- I schemi XML forniscono capacità di validazione rigorose.

Prerequisiti: preparare l’ambiente

  • Inserisci Visual Studio o qualsiasi compatibile .NET IDE.
  • Creare un nuovo progetto di applicazione .NET 8 console.
  • Installare Aspose.Medical dal NuGet Package Manager.

Guida passo dopo passo per la conversione di DICOM in XML

Passo 1: Installare Aspose.Medical

Aggiungi la biblioteca medica Aspose al tuo progetto utilizzando NuGet.

Install-Package Aspose.Medical

Passo 2: Includere gli spazi di nome necessari

Aggiungi riferimenti agli spazi di nome richiesti nel tuo codice.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

Passo 3: Caricare il file DICOM

Scarica il file DICOM che desideri convertire.

DicomFile dcm = DicomFile.Open("patient_scan.dcm");

Passo 4: Serializzare a XML

Utilizzare il DicomXmlSerializer.Serialize Metodo di conversione in XML.

string xml = DicomXmlSerializer.Serialize(dcm.Dataset);

Passo 5: Salva l’output XML

Salva XML in un file per archiviazione o trasmissione.

File.WriteAllText("patient_scan.xml", xml);

Passo 6: Deserializzare XML Torna al Dataset

Per convertire XML di nuovo in DICOM, utilizzare il Deserialize Il metodo.

Dataset? dataset = DicomXmlSerializer.Deserialize(xml);

Esempio di codice completo: Conversione DICOM a XML

Ecco un esempio completo per la conversione di DICOM in 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");

Esempio di codice completo: Conversione XML a DICOM

Ecco un esempio completo per la conversione di XML in 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.");
}

Esempio di round-trip: DICOM → XML → DIKOM

Conversione completa round-trip che dimostra l’integrità dei dati:

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");
}

Esempio Struttura di uscita XML

L’output XML rappresenta le etichette DICOM in un formato strutturato:

<?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>

Risultati di JSON vs XML Output

Dimensioni di confronto

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

Utilizzare le raccomandazioni Case

ScenarioIl formato raccomandato
Nuovi servizi webdi JSON
L’integrazione del PACSdi XML
HL7 di middlewaredi XML
Giochi di JavaScript frontendsdi JSON
Trasformazioni XSLTdi XML
Database di NoSQLdi JSON
Validazione schemadi XML

L’integrazione con i sistemi legati

Esempio di integrazione con legacy 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

Trattamento invalido XML

Inserisci la deserializzazione in try-catch per il trattamento degli errori:

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}");
}

Personaggi che codificano i problemi

Assicurarsi di codificare correttamente durante la lettura/scrittura dei file 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();
}

Big file di gestione

Per i file DICOM molto grandi, considerare 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);
}

Informazioni aggiuntive

  • Il formato XML fornisce una migliore lettura umana con una corretta indentazione.
  • XML è più verbo di JSON, portando a grandi dimensioni di file.
  • Considera la compressione per la memorizzazione o la trasmissione di grandi file XML.
  • Sia JSON che XML supportano gli stessi tipi di dati e strutture DICOM.

conclusione

Questo tutorial ha dimostrato come convertire i file DICOM in formato XML e deserializzare XML in C# utilizzando Aspose.Medical.

 Italiano