• Реализация алгоритма нормализации XML для СМЭВ 3?

    IvanU7n
    @IvanU7n
    nothing interesting here
    Для будущих искателей: вот такой монстрик у меня получился (PHP 7.1). Он проходит все проверки из МР 3.5, но, возможно, некоторых нюансов не учитывает.
    <?php
    $in = new DOMDocument();
    $in->load($argv[1]);
    
    $out = new XMLWriter();
    $out->openMemory();
    
    $index = 0;
    $stack = [null, [$in->documentElement, []]];
    while (count($stack)) {
    	$item = array_pop($stack);
    	if ($item === null) {
    		$out->text('');
    		$out->endElement();
    		continue;
    	}
    	[$node, $nsList] = $item;
    	if ($node->nodeType == XML_ELEMENT_NODE) {
    		// Let the magic begin! ;)
    		// The element itself.
    		if ($node->namespaceURI !== null) {
    			$thisLevel = false;
    			if (($nsList[$node->namespaceURI] ?? null) === null) {
    				$thisLevel = true;
    				$nsList[$node->namespaceURI] = 'ns' . ++$index;
    			}
    			$out->startElement("{$nsList[$node->namespaceURI]}:{$node->localName}");
    			if ($thisLevel) {
    				$out->writeAttribute("xmlns:{$nsList[$node->namespaceURI]}", $node->namespaceURI);
    			}
    		}
    		else {
    			$out->startElement($node->localName);
    		}
    		// Attributes.
    		$attrs = iterator_to_array($node->attributes);
    		usort($attrs, function($a, $b) {
    			if ($a->namespaceURI !== null && $b->namespaceURI === null) return -1;
    			else if ($a->namespaceURI === null && $b->namespaceURI !== null) return 1;
    			else return strcmp($a->namespaceURI, $b->namespaceURI) ?: strcmp($a->localName, $b->localName);
    		});
    		foreach ($attrs as $attr) {
    			if ($attr->namespaceURI !== null && ($nsList[$attr->namespaceURI] ?? null) === null) {
    				$nsList[$attr->namespaceURI] = 'ns' . ++$index;
    				$out->writeAttribute("xmlns:{$nsList[$attr->namespaceURI]}", $attr->namespaceURI);
    			}
    		}
    		foreach ($attrs as $attr) {
    			if ($attr->namespaceURI !== null) {
    				$out->writeAttribute("{$nsList[$attr->namespaceURI]}:{$attr->localName}", $attr->nodeValue);
    			}
    			else {
    				$out->writeAttribute($attr->localName, $attr->nodeValue);
    			}
    		}
    	}
    	else if ($node->nodeType == XML_TEXT_NODE && strlen(trim($node->nodeValue))) {
    		$out->text($node->nodeValue);
    	}
    
    	if ($node->lastChild !== null) {
    		$stack[] = null;
    		for ($node = $node->lastChild; $node !== null; $node = $node->previousSibling) {
    			$stack[] = [$node, $nsList];
    		}
    	}
    }
    
    echo $out->outputMemory(), "\n";
    
    ?>
    Ответ написан
    9 комментариев
  • С#/Python/Node.js для сервера социальной игры, что выбрать?

    Barada
    @Barada
    Всё равно. Технологии из топ 10. Всё быстрое, всё масштабируемое, всё надёжное. Если у девов руки растут из плеч.
    Ответ написан
    Комментировать
  • Какой встраиваемый язык выбрать: Lua или Python?

    icelaba
    @icelaba
    Знаю и умею всё
    lua а именно ее разновидность luajit имеет особенность которая выделяет luajit из всех скриптовых языков, а именно "халявное" взаимодействие с C чз ffi, не надо конвертить Cшные структуры - можно читать напрямую без потерь на конверсию во внутренние типы скриптового языка.
    luajit - очень очень быстрый, у меня на части задач он выдает производительность равную C шному коду

    Сама по себе lua если выкинуть парсер и как следствие использовать прекомпилированный lua код, очень мало увеличит размер вашего приложения - в случае android не больше чем на 50кб (там правда apk это zip)

    Собственно я использую luajit именно по причине ffi
    и невероятной скорости.

    Недостаток lua - меня коробят конструкции if then end do :-) - но только в эстетическом плане, сам по себе язык очень мощный и имеет все что надо - тупели, клозуры и тп :-)
    Ответ написан
    Комментировать
  • Python для микроконтроллеров?

    Ten
    @Ten

    От Python там останется только синтаксис, а синтаксис для МК - не главное.
    Чего только люди не придумают, чтобы на C не писать :)

    Ответ написан
    2 комментария