Serializer.pm 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package XML::Serializer;
  2. use strict;
  3. my $root_element = "root";
  4. my $indent = " ";
  5. #my $XML_HEADER = << "XMLHEADER";
  6. #<?xml version="1.0" encoding="__CHARSET__"?>
  7. #<?xml-stylesheet type="text/xsl" href="__XSLT__" ?>
  8. #XMLHEADER
  9. my $XML_HEADER = << "XMLHEADER";
  10. <?xml version="1.0" encoding="__CHARSET__"?>
  11. XMLHEADER
  12. sub WITH_HEADER {
  13. return 1;
  14. }
  15. sub new {
  16. my ($this, $data, $root_name, $xslt) = @_;
  17. my %fields = (
  18. _charset => "utf-8",
  19. _data => "",
  20. _output => "",
  21. _root_name => $root_name ? $root_name : "root",
  22. _xslt => $xslt ? $xslt : ""
  23. );
  24. if (defined $data) {
  25. $fields{_data} = $data;
  26. }
  27. return bless \%fields, $this;
  28. }
  29. sub set_root_name {
  30. my ($this, $root_name) = @_;
  31. $this->{_root_name} = $root_name;
  32. }
  33. sub set_data {
  34. my ($this, $data) = @_;
  35. $this->{_data} = $data;
  36. }
  37. sub set_charset {
  38. my ($this, $charset) = @_;
  39. $this->{_charset} = $charset;
  40. }
  41. sub set_xslt {
  42. my ($this, $xslt) = @_;
  43. $this->{_xslt} = $xslt;
  44. }
  45. sub to_string{
  46. my ($this, $header) = @_;
  47. if ($header) {
  48. $this->{_output} = &_make_xml_header($this->{_charset}, $this->{_xslt});
  49. }
  50. $this->{_output} .= &_to_string($this->{_data}, $this->{_root_name});
  51. }
  52. sub to_formatted{
  53. my ($this, $header) = @_;
  54. if ($header) {
  55. $this->{_output} = &_make_xml_header($this->{_charset}, $this->{_xslt});
  56. }
  57. $this->{_output} .= &_to_formatted($this->{_root_name}, $this->{_data});
  58. }
  59. sub _make_xml_header {
  60. my $header = $XML_HEADER;
  61. $header =~ s/__CHARSET__/$_[0]/;
  62. $header =~ s/__XSLT__/$_[1]/;
  63. return $header;
  64. }
  65. sub _to_string {
  66. my ($obj, $name) = @_;
  67. my $output = "";
  68. if (ref($obj) eq "HASH") {
  69. my $attr_list = "";
  70. my $tmp_mid = "";
  71. foreach (sort keys %$obj) {
  72. if ($_ =~ /^@/) {
  73. $attr_list = &_to_string($_, $obj->{$_});
  74. }
  75. $tmp_mid .= &_to_string($_, $obj->{$_});
  76. }
  77. $output = &_start_node($name, $attr_list) . $tmp_mid . &_end_node($name);
  78. }
  79. elsif (ref($obj) eq "ARRAY") {
  80. foreach (@$obj) {
  81. $output .= &_to_string($_, $name);
  82. }
  83. }
  84. else {
  85. if ($_ =~ /^@(.+)$/) {
  86. return "$1=\"$obj\" ";
  87. } else {
  88. $output = &_start_node($name) . $obj . &_end_node($name);
  89. }
  90. }
  91. return $output;
  92. }
  93. sub _to_formatted {
  94. my ($name, $obj, $depth) = @_;
  95. # if (!$obj) { $obj = ""; }
  96. if (!defined($depth)) { $depth = 0; }
  97. my $output = "";
  98. if (ref($obj) eq "HASH") {
  99. my $attr_list = "";
  100. my $tmp_mid = "";
  101. foreach (sort keys %$obj) {
  102. if ($_ =~ /^@/) {
  103. $attr_list = &_to_string($_, $obj->{$_});
  104. }
  105. $tmp_mid .= &_to_formatted($_, $obj->{$_}, $depth+1);
  106. }
  107. $output = &_start_node($name, $attr_list, $depth) . "\n" . $tmp_mid . &_end_node($name, $depth);
  108. }
  109. elsif (ref($obj) eq "ARRAY") {
  110. foreach (@$obj) {
  111. $output .= &_to_formatted($name, $_, $depth);
  112. }
  113. }
  114. else {
  115. if ($_ =~ /^@(.+)$/) {
  116. #return "$1=\"$obj\" ";
  117. } else {
  118. $output .= &_start_node($name, "", $depth);
  119. $output .= $obj;
  120. $output .= &_end_node($name);
  121. }
  122. }
  123. return $output;
  124. }
  125. sub _start_node {
  126. my $ret = "";
  127. if (defined $_[2]) {
  128. for(1..$_[2]) { $ret .= $indent; }
  129. }
  130. my $tag = $_[0] ? $_[0] : "";
  131. my $attr = $_[1] ? $_[1] : "";
  132. $ret .= "<$tag $attr>";
  133. return $ret;
  134. }
  135. sub _end_node {
  136. my $ret = "";
  137. if (defined $_[1]) {
  138. for(1..$_[1]) { $ret .= $indent; }
  139. }
  140. if (defined $_[0]) {
  141. $ret .= "</$_[0]>\n";
  142. }
  143. return $ret;
  144. }
  145. 1;