File: meta.cpp

package info (click to toggle)
ismrmrd 1.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,408 kB
  • sloc: cpp: 12,225; ansic: 2,449; xml: 453; python: 42; makefile: 15
file content (59 lines) | stat: -rw-r--r-- 1,554 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "ismrmrd/meta.h"
#include "pugixml.hpp"


namespace ISMRMRD
{
  void deserialize(const char* xml, MetaContainer& h)
  {
    pugi::xml_document doc;
    pugi::xml_parse_result result = doc.load(xml);
    
    if (!result) {
      throw std::runtime_error("Unable to load ISMRMRD Meta XML document");
    }

    pugi::xml_node root = doc.child("ismrmrdMeta");

    if (!root) {
      throw std::runtime_error("ismrmrdMeta tag not found in meta data header");
    }
    
    pugi::xml_node meta = root.child("meta");
    while (meta) {
      pugi::xml_node name = meta.child("name");
      pugi::xml_node value = meta.child("value");

      if (!name || !value) {
	std::runtime_error("Malformed metadata value");
      }

      while (value) {
	h.append(name.child_value(),value.child_value());
	value = value.next_sibling("value");
      }

      meta = meta.next_sibling("meta");
    }
  }

  void serialize(MetaContainer& h, std::ostream& o)
  {
    pugi::xml_document doc;
    pugi::xml_node root = doc.append_child("ismrmrdMeta");
    
    MetaContainer::map_t::iterator it = h.map_.begin();
    while (it != h.map_.end()) {
      pugi::xml_node meta = root.append_child("meta");
      pugi::xml_node name = meta.append_child("name");
      name.append_child(pugi::node_pcdata).set_value(it->first.c_str());
      for (unsigned int i = 0; i < it->second.size(); i++) {
	pugi::xml_node name = meta.append_child("value");
	name.append_child(pugi::node_pcdata).set_value(it->second[i].as_str());
      }
      it++;
    }
    doc.save(o);
  }

}