1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
<?php
/**
* +----------------------------------------------------------------------+
* | Copyright (c) 1997-2023 The PHP Group |
* +----------------------------------------------------------------------+
* | This source file is subject to version 3.01 of the PHP license, |
* | that is bundled with this package in the file LICENSE, and is |
* | available through the world-wide-web at the following url: |
* | https://www.php.net/license/3_01.txt. |
* | If you did not receive a copy of the PHP license and are unable to |
* | obtain it through the world-wide-web, please send a note to |
* | license@php.net, so we can mail you a copy immediately. |
* +----------------------------------------------------------------------+
* | Authors: André L F S Bacci <ae php.net> |
* +----------------------------------------------------------------------+
* | Description: Misc funcionality dealing with raw XML. |
* +----------------------------------------------------------------------+
*/
require_once __DIR__ . '/all.php';
class XmlUtil
{
public static function extractEntities( $filename )
{
$was = libxml_use_internal_errors( true );
$doc = new DOMDocument();
$doc->recover = true;
$doc->resolveExternals = false;
$doc->load( $filename );
$errors = libxml_get_errors();
libxml_clear_errors();
libxml_use_internal_errors( $was );
$ret = [];
foreach ($errors as $error)
{
if ( preg_match( "/Entity '(\S+)' not defined/" , $error->message , $matches ) )
$ret[] = $matches[1];
}
return $ret;
}
public static function listNodeType( DOMNode $node , int $type )
{
$ret = [];
XmlUtil::listNodeTypeRecurse( $node , $type , $ret );
return $ret;
}
public static function listNodeTypeRecurse( DOMNode $node , int $type, array & $ret )
{
if ( $node->nodeType == $type )
$ret[] = $node;
foreach( $node->childNodes as $child )
XmlUtil::listNodeTypeRecurse( $child , $type, $ret );
}
public static function loadFile( $filename ):DOMDocument
{
$contents = file_get_contents( $filename );
return XmlUtil::loadText( $contents );
}
public static function loadText( $contents ):DOMDocument
{
$was = libxml_use_internal_errors( true );
$doc = new DOMDocument();
$doc->preserveWhiteSpace = true;
$doc->recover = true;
$doc->resolveExternals = false;
$doc->substituteEntities = false;
$doc->loadXML( $contents );
libxml_clear_errors();
libxml_use_internal_errors( $was );
return $doc;
}
}
|