Як перетворити DICOM на XML і назад за допомогою DicomXml
Цей навчальний заклад показує, як конвертувати файли 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: Дезеріалізація XML назад до Dataset
Щоб перетворити XML назад на DICOM, використовуйте Deserialize Метод є.
Dataset? dataset = DicomXmlSerializer.Deserialize(xml);Докладніше: DICOM to 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 Conversion
Ось повний приклад перетворення 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.");
}Докладніше: ДІКОМ → XML → DICOM
Повний круглий маршрут конверсії, що демонструє цілісність даних:
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
Вихід 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 | Рекомендований формат |
|---|---|
| Нові веб-сервіси | 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
Створення Invalid 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 назад в DicOM в C# за допомогою Aspose.Medical. XML серізація є необхідною для інтеграції з спадщиною систем охорони здоров’я і середовищ, які залежать від XML інструментів і робочих потоків.