使用MyDICOM从DICOM中提取嵌入的xml文件

时间:2015-07-29 16:47:19

标签: c# dicom

我收到带有嵌入式xml结果文件的DICOM图像。我可以使用DVTk找到xml应该位于的标签,但是我无法弄清楚如何使用MyDICOM提取它。

我无法共享DICOM,因为它包含专有信息,我没有权限。我希望有人能够与MyDICOM合作,可能会有所帮助。

我怀疑发布我会帮助任何人的代码,但无论如何我都会这样做:

if (element.ValueRepresentation.ToString().ToLower().Equals("ob"))
{
    DeferredStream stream = element.Get(0) as DeferredStream;
    MyDicom.StreamReader reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
    reader.UseDeferredStream = true;
    reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
    if (dicom.PrivateDictionary != null)
        reader.PrivateDictionary = dicom.PrivateDictionary;
    //object embedded = reader.Deserialize(this.dataSetStartTag, this.dataSetEndTag);
 }

我不确定这段代码是否真的有效,即使有,我也没有开始和结束标签。我没有提供太多信息,所以我没有期待太多,但我希望能够在正确的方向上轻松推动。

1 个答案:

答案 0 :(得分:0)

这不是正确的方法,但这是我能够在没有MyDICOM正确文档的情况下找到的唯一方法。我将流加载到一个字符串中,然后搜索我需要的信息。

//  Set up the stream
object elem = element.Get(0);
if (elem is DeferredStream)
     stream = elem as DeferredStream;
else if (elem is MemoryStream)
     stream = elem as MemoryStream;

//  Set up the stream reader
reader = new MyDicom.StreamReader(stream, dicom.MetaData.Tsn);
reader.UseDeferredStream = (elem is DeferredStream);
reader.EnforceEvenByteSizeElement = dicom.EnforceEvenByteSize;
if (dicom.PrivateDictionary != null)
     reader.PrivateDictionary = dicom.PrivateDictionary;

//  Read the Stream into a String
byte[] read = reader.ReadBytes(Convert.ToInt32(stream.Length));
String data = System.Text.Encoding.Default.GetString(read);
int start = data.IndexOf("<PatientData>");
int length = data.Substring(start).IndexOf("</PatientData>") + 15;

if (start > 0 && length > 0)
     result = data.Substring(start, length);
else
     result = "";

我担心这种方法的速度和准确性,所以如果有人知道的话,仍然会欢迎正确的方法。否则,我会将此标记为完整。