如何从 xml_parser() 获取节点名称


How do i get the node-names from 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是一行又一行地解析的,对吧?所以我必须暂时保存整个项目中的节点,并决定是否要将该项目写入文件。有没有办法做到这一点?

每次调用 ChunkXMLBigFile 函数时,代码都会有效地读取整个源文件。

while循环之后,你拥有了所有的元素,然后你可以按照任何你喜欢的方式操作它们。

有关如何解决此问题,请参阅以下问题:

  • 如何使用 DOM 对 xml 文件进行排序
  • 使用 PHP 对 XML 节点进行排序

如果您之后以$howmany为批次解析块,那么您就到了您想要的位置。


提示:网上有许多示例,其中此功能以面向对象编程 (OOP( 方法呈现,其中所有函数都在类中。这也将消除对global变量的需求,这些变量可能会导致一些(阅读:很多(挫折和混乱。