23 define(
'XML_PARSER_SOURCE_ENCODING',
Config::getVar(
'i18n',
'client_charset'));
24 define(
'XML_PARSER_TARGET_ENCODING',
Config::getVar(
'i18n',
'client_charset'));
26 import(
'lib.pkp.classes.xml.XMLParserDOMHandler');
40 $this->errors = array();
46 if (!isset($this->handler)) {
52 xml_set_object($parser, $this->handler);
53 xml_set_element_handler($parser,
"startElement",
"endElement");
54 xml_set_character_data_handler($parser,
"characterData");
56 if (!xml_parse($parser, $text,
true)) {
57 $this->
addError(xml_error_string(xml_get_error_code($parser)));
60 $result = $this->handler->getResult();
74 function parse($file) {
77 if (!isset($this->handler)) {
83 xml_set_object($parser, $this->handler);
84 xml_set_element_handler($parser,
"startElement",
"endElement");
85 xml_set_character_data_handler($parser,
"characterData");
87 if (!$stream = $this->
_getStream($file))
return false;
89 while (($data = $stream->read(16384)) !==
'') {
90 if (!xml_parse($parser, $data, $stream->eof())) {
91 $this->
addError(xml_error_string(xml_get_error_code($parser)));
96 $result = $this->handler->getResult();
109 protected function _getStream($filenameOrUrl) {
110 $urlPieces = parse_url($filenameOrUrl);
111 if ($urlPieces && isset($urlPieces[
'scheme'])) {
114 $response = $client->request(
'GET', $filenameOrUrl);
116 } elseif (file_exists($filenameOrUrl) && is_readable($filenameOrUrl)) {
117 $resource = fopen($filenameOrUrl,
'r');
128 array_push($this->errors, $error);
144 return empty($this->errors);
164 $result = xml_parse_into_struct($parser, $text, $values, $tags);
166 if (!$result)
return null;
170 foreach ($tags as $key => $indices) {
171 if (!empty($tagsToMatch) && !in_array($key, $tagsToMatch)) {
175 $data[$key] = array();
177 foreach ($indices as $index) {
178 if (!isset($values[$index][
'type']) || ($values[$index][
'type'] !=
'open' && $values[$index][
'type'] !=
'complete')) {
182 $data[$key][] = array(
183 'attributes' => isset($values[$index][
'attributes']) ? $values[$index][
'attributes'] : array(),
184 'value' => isset($values[$index][
'value']) ? $values[$index][
'value'] :
''
199 function parseStruct($file, $tagsToMatch = array()) {
201 $fileContents = $stream->getContents();
202 if (!$fileContents) {
213 $parser = xml_parser_create(XML_PARSER_SOURCE_ENCODING);
214 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, XML_PARSER_TARGET_ENCODING);
215 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING,
false);
224 xml_parser_free($parser);