Como converter DICOM para XML e Back usando DicomXmlSerializer
Este tutorial demonstra como converter arquivos DICOM para o formato XML e deserializar o XML de volta para DicOM usando C#. Formato XML é preferido para integração com sistemas de herança, fluxos de trabalho HL7 e ambientes onde a ferramenta XML está bem estabelecida.
Quando usar XML sobre JSON
• Integração Legatória:- Os softwares e sistemas existentes geralmente esperam o formato XML.
*H7 Compatibilidade- Os sistemas de saúde que usam HL7 v2/v3 normalmente funcionam com XML.
- A ferramenta XML é:- Organizações com transformações XSLT e perguntas XPath estabelecidas.
- Validação do Plano *:- Os esquemas XML fornecem capacidades de validação rigorosas.
Título: Preparando o Meio Ambiente
- Instale o Visual Studio ou qualquer .NET IDE compatível.
- Crie um novo projeto de aplicação .NET 8 console.
- Instale Aspose.Medical do NuGet Package Manager.
Guia passo a passo para converter DICOM para XML
Passo 1: Instalar Aspose.Medical
Adicione a Aspose.Medical Library ao seu projeto usando NuGet.
Install-Package Aspose.MedicalPasso 2: Incluir os espaços de nome necessários
Adicione referências aos espaços de nomes necessários em seu código.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;Passo 3: Carregar o arquivo DICOM
Carregue o arquivo DICOM que você deseja converter.
DicomFile dcm = DicomFile.Open("patient_scan.dcm");Passo 4: Serialize para XML
Use o DicomXmlSerializer.Serialize Método de conversão para XML.
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);Passo 5: Salve a saída XML
Salve o XML para um arquivo para armazenamento ou transmissão.
File.WriteAllText("patient_scan.xml", xml);Passo 6: Deserialize o XML de volta ao Dataset
Para converter XML de volta para DICOM, use o Deserialize do método.
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);Exemplo de código completo: conversão de DICOM para XML
Aqui está um exemplo completo de conversão de DICOM para 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");Exemplo de código completo: conversão XML para DICOM
Aqui está um exemplo completo de conversão de XML para 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.");
}Exemplo: DICOM → XML → DIKOM
Conversão completa rodada que demonstra integridade de dados:
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");
}Estrutura de saída XML
A saída XML representa as tags DICOM em um formato estruturado:
<?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>Comparação de JSON vs XML Output
tamanho comparação
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 JSONRecomendações de caso
| Scenario | Formato recomendado |
|---|---|
| Novos Serviços Web | JSON |
| Integração PACS | O XML |
| HL7 Médicos | O XML |
| Avaliações JavaScript frontends | JSON |
| Transformações XSLT | O XML |
| NoSQL Base de Dados | JSON |
| Validação do esquema | O XML |
Integração com Sistemas de Legacy
Exemplo de integração com herança 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
Manejo de XML Invalido
Inserir a desertificação no try-catch para o tratamento de erros:
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}");
}Caracterização de Problemas
Assegurar a codificação correta ao ler/escrever arquivos 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();
}Manutenção de arquivos grandes
Para arquivos DICOM muito 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);
}Informações adicionais
- O formato XML fornece uma melhor leitura humana com indentação adequada.
- O XML é mais verbo do que o JSON, resultando em tamanhos de arquivo maiores.
- Considere a compressão para armazenar ou transmitir grandes arquivos XML.
- Tanto o JSON quanto o XML suportam os mesmos tipos e estruturas de dados DICOM.
Conclusão
Este tutorial demonstrou como converter arquivos DICOM para o formato XML e deserializar XML de volta para DicOM em C# usando Aspose.Medical. a serialização XML é essencial para a integração com sistemas de saúde hereditários e ambientes que dependem da ferramenta e fluxos de trabalho XML.