19 declare(strict_types=1);
63 $set = $this->scaffold_provider->set();
64 $root_element = $set->
getRoot();
66 if ($xml->getName() !== $root_element->getDefinition()->name()) {
67 throw new \ilMDXMLException(
68 $xml->getName() .
' is not the correct root element, should be ' .
69 $root_element->getDefinition()->name()
73 $this->prepareAddingSubElementsFromXML(
76 $this->dictionary->tagForElement($root_element, $version),
83 protected function prepareAddingSubElementsFromXML(
91 throw new \ilMDXMLException(
'LOM XML is nested too deep.');
94 if ($tag?->isExportedAsLangString()) {
99 $children_and_attributes = new \AppendIterator();
100 if (!empty($children = $xml->children())) {
101 $children_and_attributes->append($children);
103 if (!empty($attributes = $xml->attributes())) {
104 $children_and_attributes->append($attributes);
107 foreach ($children_and_attributes as $child_or_attrib_xml) {
109 $this->scaffold_provider,
110 $child_or_attrib_xml->getName(),
112 if (is_null($sub_scaffold)) {
116 $sub_tag = $this->dictionary->tagForElement($sub_scaffold, $version);
117 if ($sub_tag?->isOmitted()) {
122 $sub_scaffold->getDefinition(),
124 (string) $child_or_attrib_xml
126 $sub_scaffold->mark($this->marker_factory, Action::CREATE_OR_UPDATE, $sub_value);
128 $this->prepareAddingSubElementsFromXML(
132 $child_or_attrib_xml,
143 $string_xml = $xml->string;
144 $language_xml = $string_xml->attributes()->language;
146 if (!empty($string_xml) && ((
string) $string_xml) !==
'') {
148 $this->scaffold_provider,
151 $string_element->mark(
152 $this->marker_factory,
153 Action::CREATE_OR_UPDATE,
155 $string_element->getDefinition(),
156 $this->dictionary->tagForElement($string_element, $version),
162 if (!empty($language_xml)) {
164 $this->scaffold_provider,
167 $language_element->mark(
168 $this->marker_factory,
169 Action::CREATE_OR_UPDATE,
171 $language_element->getDefinition(),
172 $this->dictionary->tagForElement($language_element, $version),
173 (string) $language_xml
184 $value = strip_tags($value);
186 if ($tag?->isTranslatedAsCopyright()) {
187 return $this->copyright_handler->copyrightFromExport($value);
195 if ($value ===
'none') {
201 case Type::VOCAB_SOURCE:
202 case Type::VOCAB_VALUE:
204 case Type::NON_NEG_INT: