如何使用 DicomXml 将 DICOM 转换为 XML 和 Back

如何使用 DicomXml 将 DICOM 转换为 XML 和 Back

此教程展示了如何将 DICOM 文件转换为 XML 格式,并使用 C# 将 XML 的返回到 DicOM。

什么时候使用 XML 在 JSON 上

    • 法定整合*:- 现有中间软件和系统往往期待XML格式。
  • HL7兼容性:- 使用 HL7 v2/v3 的医疗保健系统通常使用 XML。

    • XML 工具*:- 设立的XSLT转型和XPath查询的组织。
  • *计划验证:- XML 方案提供严格的验证能力。

原标题:准备环境

  • 设置 Visual Studio 或任何兼容的 .NET IDE.
  • 创建一个新的 .NET 8 控制台应用程序项目。
  • 在 NuGet Package Manager 中安装 Aspose.Medical。

步骤指南将DICOM转换为XML

步骤1:安装 Aspose.Medical

使用 NuGet 将 Aspose.Medical 图书馆添加到您的项目中。

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

使用 The DicomXmlSerializer.Serialize 转换为XML的方法。

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

步骤5:保存 XML 输出

将 XML 保存到存储或传输的文件。

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

步骤6:将 XML 转换为数据集

要将 XML 转换为 DICOM,请使用 Deserialize 方法.

Dataset? dataset = DicomXmlSerializer.Deserialize(xml);

完整代码示例:DICOM到XML转换

以下是如何将 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 → 迪科姆

完整的圆形转换,证明数据完整性:

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

与遗产系统的整合

例子集成与遗产中介:

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

Wrap deserialization in try-catch for error 错误处理:

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 格式,并用 Aspose.Medical 在 C# 中将 XML 返回 DIKOM。

 中文