Как я могу получить имена узлов из xml_parser ()

Я пытаюсь предварительно отсортировать и нарезать большой файл XML для последующей обработки через xml_parser

    function CreateXMLParser($CHARSET, $bareXML = false) {
$CURRXML = xml_parser_create($CHARSET);
xml_parser_set_option( $CURRXML, XML_OPTION_CASE_FOLDING, false);
xml_parser_set_option( $CURRXML, XML_OPTION_TARGET_ENCODING, $CHARSET);
xml_set_element_handler($CURRXML, 'startElement', 'endElement');
xml_set_character_data_handler($CURRXML, 'dataHandler');
xml_set_default_handler($CURRXML, 'defaultHandler');
if ($bareXML) {
xml_parse($CURRXML, '<?xml version="1.0"?>', 0);
}
return $CURRXML;
}

function ChunkXMLBigFile($file, $tag = 'item', $howmany = 1000) {
global $CHUNKON, $CHUNKS, $ITEMLIMIT;

$CHUNKON   = $tag;
$ITEMLIMIT = $howmany;
$xml = CreateXMLParser('UTF-8', false);

$fp = fopen($file, "r");
$CHUNKS  = 0;
while(!feof($fp)) {
$chunk = fgets($fp, 10240);
xml_parse($xml, $chunk, feof($fp));
}
xml_parser_free($xml);
processChunk();
}
function processChunk() {
global $CHUNKS, $PAYLOAD, $ITEMCOUNT;
if ('' == $PAYLOAD) {
return;
}

$xp = fopen($file = "xmlTemp/slices/slice_".$CHUNKS.".xml", "w");
fwrite($xp, '<?xml version="1.0" ?>'."\n");
fwrite($xp, "<producten>");
fwrite($xp, $PAYLOAD);
fwrite($xp, "</producten>");
fclose($xp);
print "Written ".$file."<br>";
$CHUNKS++;
$PAYLOAD    = '';
$ITEMCOUNT  = 0;
}



function startElement($xml, $tag, $attrs = array())  {
global $PAYLOAD, $CHUNKS, $ITEMCOUNT, $CHUNKON;

if (!($CHUNKS||$ITEMCOUNT)) {
if ($CHUNKON == strtolower($tag)) {
$PAYLOAD = '';
}
} else {
$PAYLOAD .= "<".$tag;
}
foreach($attrs as $k => $v) {
$PAYLOAD .= " $k=".'"'.addslashes($v).'"';
}
$PAYLOAD .= '>';
}


function endElement($xml, $tag) {
global $CHUNKON, $ITEMCOUNT, $ITEMLIMIT;

dataHandler(null, "<$tag>");
if ($CHUNKON == strtolower($tag)) {
if (++$ITEMCOUNT >= $ITEMLIMIT) {
processChunk();
}
}
}

function dataHandler($xml, $data) {
global $PAYLOAD;
$PAYLOAD .= $data;
}

но как я могу получить доступ к имени узла ??

.. Я должен отсортировать некоторые предметы (с N узлы) перед сохранением файла слайса. XML анализируется строка за строкой, верно? поэтому я должен временно сохранить узлы из целого элемента и решить, будет ли элемент записан в файл. Есть ли способ сделать это?

1

Решение

Ваш код эффективно читает весь исходный файл каждый раз, когда вы вызываете ChunkXMLBigFile функция.

После вашего while В цикле у вас есть все элементы, которыми вы можете манипулировать любым удобным для вас способом.

Смотрите следующие вопросы о том, как подойти к этому:

Если вы анализируете куски после этого в партиях $howmany ты там, где хочешь быть.


Совет: есть много примеров в сети, где эта функциональность представлена ​​в подходе объектно-ориентированного программирования (ООП), где все функции находятся внутри класса. Это также устранит необходимость global переменные, которые могут вызвать некоторые (читай: много) разочарования и путаницы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]