Как конвертировать DICOM в XML и назад с помощью DicomXmlSerializer
Этот урок показывает, как конвертировать файлы DICOM в XML-формат и десертизировать XML обратно в DicOM с помощью C#. Формат XML предпочтительнее для интеграции с наследственными системами, рабочими потоками HL7 и средами, где XML инструментарий хорошо установлен.
Когда использовать XML через JSON
- Легальная интеграция *:- Существующие средние программы и системы часто ожидают XML-формата.
** Совместимость HL7*- Системы здравоохранения, использующие HL7 v2/v3, обычно работают с XML.
• XML Tooling:- Организации с установленными трансформациями XSLT и запросами XPath.
- Схема валидации*- Схемы XML обеспечивают строгие возможности валидации.
Преимущества: Подготовка к окружающей среде
- Настройка Visual Studio или любой совместимый .NET IDE.
- Создайте новый проект приложения .NET 8 для консоли.
- Инсталляция Aspose.Medical из NuGet Package Manager.
Шаг за шагом Руководство для конвертации DICOM в XML
Шаг 1: Инсталляция Aspose.Medical
Добавьте в свой проект библиотеку Aspose.Medical с помощью NuGet.
Install-Package Aspose.MedicalШаг 2: Включение необходимых номенклатур
Добавьте ссылки на требуемые именные пространства в вашем коде.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;Шаг 3: Загрузите файл DICOM
Загрузите файл DICOM, который вы хотите конвертировать.
DicomFile dcm = DicomFile.Open("patient_scan.dcm");Шаг 4: Сериализировать к XML
Используйте DicomXmlSerializer.Serialize Метод конвертации в XML.
string xml = DicomXmlSerializer.Serialize(dcm.Dataset);Шаг 5: Сохранение выхода XML
Сохраните XML в файл для хранения или передачи.
File.WriteAllText("patient_scan.xml", xml);Шаг 6: Deserialize XML Back to Dataset
Чтобы конвертировать XML обратно в DICOM, используйте Deserialize и метода.
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);Полный пример кода: DICOM в XML Conversion
Вот полный пример конвертации DICOM в 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");Полный пример кода: XML в DICOM конверсия
Вот полный пример конвертации XML обратно в 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.");
}Пример: DICOM → XML → DIKOM
Полный круглый маршрут конверсии, демонстрирующий целостность данных:
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");
}Пример XML Output Structure
Выход XML представляет теги DICOM в структурированном формате:
<?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>Сравнение JSON против XML
Размер сравнения
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Применение случайных рекомендаций
| Scenario | Рекомендуемый формат |
|---|---|
| Новые сервисы WEB | JSON |
| Интеграция PACS | XML |
| HL7 средний | XML |
| JavaScript фронтоны | JSON |
| Трансформация XSLT | XML |
| NoSQL базы данных | JSON |
| Схема валидации | XML |
Интеграция с наследственными системами
Пример интеграции с наследием 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
Обработка недействительных XML
Загрузить десертификацию в try-catch для обработки ошибок:
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}");
}Характер кодирования проблем
Убедитесь в правильном кодировании при чтении / написании 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();
}обработка больших файлов
Для очень больших DICOM файлов, рассмотрим потоки:
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);
}Дополнительная информация
- Формат XML обеспечивает лучшую человеческую читаемость с правильной индентацией.
- XML более вербально, чем JSON, что приводит к большим размерам файлов.
- Рассмотрим компрессию для хранения или передачи больших XML-файлов.
- Как JSON, так и XML поддерживают те же типы и структуры данных DICOM.
Заключение
Этот урок продемонстрировал, как конвертировать файлы DICOM в XML-формат и десертизировать XML обратно в C# с помощью Aspose.Medical. XML сериализация необходима для интеграции с наследственными системами здравоохранения и средами, которые зависят от инструмента XML и рабочих потоков.