Polyfill
10 months ago
AbstractCsv.php
10 months ago
ByteSequence.php
10 months ago
CannotInsertRecord.php
10 months ago
CharsetConverter.php
10 months ago
ColumnConsistency.php
10 months ago
EncloseField.php
10 months ago
EscapeFormula.php
10 months ago
Exception.php
10 months ago
HTMLConverter.php
10 months ago
Info.php
10 months ago
InvalidArgument.php
10 months ago
MapIterator.php
10 months ago
RFC4180Field.php
10 months ago
Reader.php
10 months ago
ResultSet.php
10 months ago
Statement.php
10 months ago
Stream.php
10 months ago
SyntaxError.php
10 months ago
TabularDataReader.php
10 months ago
UnableToProcessCsv.php
10 months ago
UnavailableFeature.php
10 months ago
UnavailableStream.php
10 months ago
Writer.php
10 months ago
XMLConverter.php
10 months ago
functions.php
10 months ago
functions_include.php
10 months ago
XMLConverter.php
177 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * League.Csv (https://csv.thephpleague.com) |
| 5 | * |
| 6 | * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> |
| 7 | * |
| 8 | * For the full copyright and license information, please view the LICENSE |
| 9 | * file that was distributed with this source code. |
| 10 | */ |
| 11 | declare (strict_types=1); |
| 12 | namespace IAWPSCOPED\League\Csv; |
| 13 | |
| 14 | use DOMAttr; |
| 15 | use DOMDocument; |
| 16 | use DOMElement; |
| 17 | use DOMException; |
| 18 | /** |
| 19 | * Converts tabular data into a DOMDocument object. |
| 20 | * @internal |
| 21 | */ |
| 22 | class XMLConverter |
| 23 | { |
| 24 | /** |
| 25 | * XML Root name. |
| 26 | * |
| 27 | * @var string |
| 28 | */ |
| 29 | protected $root_name = 'csv'; |
| 30 | /** |
| 31 | * XML Node name. |
| 32 | * |
| 33 | * @var string |
| 34 | */ |
| 35 | protected $record_name = 'row'; |
| 36 | /** |
| 37 | * XML Item name. |
| 38 | * |
| 39 | * @var string |
| 40 | */ |
| 41 | protected $field_name = 'cell'; |
| 42 | /** |
| 43 | * XML column attribute name. |
| 44 | * |
| 45 | * @var string |
| 46 | */ |
| 47 | protected $column_attr = ''; |
| 48 | /** |
| 49 | * XML offset attribute name. |
| 50 | * |
| 51 | * @var string |
| 52 | */ |
| 53 | protected $offset_attr = ''; |
| 54 | public static function create() : self |
| 55 | { |
| 56 | return new self(); |
| 57 | } |
| 58 | /** |
| 59 | * DEPRECATION WARNING! This method will be removed in the next major point release. |
| 60 | * |
| 61 | * @deprecated since version 9.7.0 |
| 62 | * @see XMLConverter::create() |
| 63 | */ |
| 64 | public function __construct() |
| 65 | { |
| 66 | } |
| 67 | /** |
| 68 | * Convert a Record collection into a DOMDocument. |
| 69 | */ |
| 70 | public function convert(iterable $records) : DOMDocument |
| 71 | { |
| 72 | $doc = new DOMDocument('1.0'); |
| 73 | $node = $this->import($records, $doc); |
| 74 | $doc->appendChild($node); |
| 75 | return $doc; |
| 76 | } |
| 77 | /** |
| 78 | * Create a new DOMElement related to the given DOMDocument. |
| 79 | * |
| 80 | * **DOES NOT** attach to the DOMDocument |
| 81 | */ |
| 82 | public function import(iterable $records, DOMDocument $doc) : DOMElement |
| 83 | { |
| 84 | $root = $doc->createElement($this->root_name); |
| 85 | foreach ($records as $offset => $record) { |
| 86 | $node = $this->recordToElement($doc, $record, $offset); |
| 87 | $root->appendChild($node); |
| 88 | } |
| 89 | return $root; |
| 90 | } |
| 91 | /** |
| 92 | * Convert a CSV record into a DOMElement and |
| 93 | * adds its offset as DOMElement attribute. |
| 94 | */ |
| 95 | protected function recordToElement(DOMDocument $doc, array $record, int $offset) : DOMElement |
| 96 | { |
| 97 | $node = $doc->createElement($this->record_name); |
| 98 | foreach ($record as $node_name => $value) { |
| 99 | $item = $this->fieldToElement($doc, (string) $value, $node_name); |
| 100 | $node->appendChild($item); |
| 101 | } |
| 102 | if ('' !== $this->offset_attr) { |
| 103 | $node->setAttribute($this->offset_attr, (string) $offset); |
| 104 | } |
| 105 | return $node; |
| 106 | } |
| 107 | /** |
| 108 | * Convert Cell to Item. |
| 109 | * |
| 110 | * Convert the CSV item into a DOMElement and adds the item offset |
| 111 | * as attribute to the returned DOMElement |
| 112 | * |
| 113 | * @param int|string $node_name |
| 114 | */ |
| 115 | protected function fieldToElement(DOMDocument $doc, string $value, $node_name) : DOMElement |
| 116 | { |
| 117 | $item = $doc->createElement($this->field_name); |
| 118 | $item->appendChild($doc->createTextNode($value)); |
| 119 | if ('' !== $this->column_attr) { |
| 120 | $item->setAttribute($this->column_attr, (string) $node_name); |
| 121 | } |
| 122 | return $item; |
| 123 | } |
| 124 | /** |
| 125 | * XML root element setter. |
| 126 | */ |
| 127 | public function rootElement(string $node_name) : self |
| 128 | { |
| 129 | $clone = clone $this; |
| 130 | $clone->root_name = $this->filterElementName($node_name); |
| 131 | return $clone; |
| 132 | } |
| 133 | /** |
| 134 | * Filter XML element name. |
| 135 | * |
| 136 | * @throws DOMException If the Element name is invalid |
| 137 | */ |
| 138 | protected function filterElementName(string $value) : string |
| 139 | { |
| 140 | return (new DOMElement($value))->tagName; |
| 141 | } |
| 142 | /** |
| 143 | * XML Record element setter. |
| 144 | */ |
| 145 | public function recordElement(string $node_name, string $record_offset_attribute_name = '') : self |
| 146 | { |
| 147 | $clone = clone $this; |
| 148 | $clone->record_name = $this->filterElementName($node_name); |
| 149 | $clone->offset_attr = $this->filterAttributeName($record_offset_attribute_name); |
| 150 | return $clone; |
| 151 | } |
| 152 | /** |
| 153 | * Filter XML attribute name. |
| 154 | * |
| 155 | * @param string $value Element name |
| 156 | * |
| 157 | * @throws DOMException If the Element attribute name is invalid |
| 158 | */ |
| 159 | protected function filterAttributeName(string $value) : string |
| 160 | { |
| 161 | if ('' === $value) { |
| 162 | return $value; |
| 163 | } |
| 164 | return (new DOMAttr($value))->name; |
| 165 | } |
| 166 | /** |
| 167 | * XML Field element setter. |
| 168 | */ |
| 169 | public function fieldElement(string $node_name, string $fieldname_attribute_name = '') : self |
| 170 | { |
| 171 | $clone = clone $this; |
| 172 | $clone->field_name = $this->filterElementName($node_name); |
| 173 | $clone->column_attr = $this->filterAttributeName($fieldname_attribute_name); |
| 174 | return $clone; |
| 175 | } |
| 176 | } |
| 177 |