Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP XMLreader时出现两个错误_Php_Xml - Fatal编程技术网

使用PHP XMLreader时出现两个错误

使用PHP XMLreader时出现两个错误,php,xml,Php,Xml,在使用XMLReader时,我有以下两个错误 1) 警告:XMLReader::read()[XMLReader.read]:MyXML.xml:43102:解析器错误:xmlParseEntityRef:无名称 2) 警告:第56行MyXMLReader.php中的XMLReader::read()[XMLReader.read]:^ 有人知道这些指的是什么吗 我的PHP代码(XML文件大约为100MB,所以我不能包含它): 表示在XML文件中有伪造的未替换的符号。(嗯,“XML”…从技术上

在使用XMLReader时,我有以下两个错误

1) 警告:XMLReader::read()[XMLReader.read]:MyXML.xml:43102:解析器错误:xmlParseEntityRef:无名称

2) 警告:第56行MyXMLReader.php中的XMLReader::read()[XMLReader.read]:^

有人知道这些指的是什么吗

我的PHP代码(XML文件大约为100MB,所以我不能包含它):


表示在XML文件中有伪造的未替换的符号。(嗯,“XML”…从技术上讲,如果格式不好,就不是XML。)

您需要检查文件中是否有孤立的
&
s(或修复生成它的代码),以将它们转义到
&。根据错误,第一个在文件的第43102行(yikes!)

表示在XML文件中有伪造的未替换的符号。(嗯,“XML”…从技术上讲,如果格式不好,就不是XML。)


您需要检查文件中是否有孤立的
&
s(或修复生成它的代码),以将它们转义到
&。根据错误,第一个在文件的第43102行(yikes!)。

你能粘贴你正在使用的php代码和XML文档吗?你能粘贴你正在使用的php代码和XML文档吗?有没有办法在
while($XML->read())
循环中转义它们?没有。如果在实体/字符引用之外有
&
,则它不是XML,XMLReader不会触及它。作为一种短期解决方法,您可以尝试在让XML解析器处理文件之前,对文件内容进行讨厌的正则表达式攻击来“修复”文件;有关示例,请参见。但是这并不是无懈可击的(它可能会弄乱comment/PI/CDATA节的内容);这不是一个可持续的解决办法。生成非XML的错误程序需要修复。如果生成XML,我会修复它。不幸的是,它来自一个政府机构。很糟糕,他们使用了非法的语法。哦,天哪。请尽可能大声地抱怨;生成格式不正确的XML是完全没有用的,任何东西都无法解析它。而unscaped
&
通常是导致XSS安全漏洞的一般编码问题的标志。有没有办法在
while($xml->read())
循环中避开它们?没有。如果在实体/字符引用之外有
&
,则它不是XML,XMLReader不会触及它。作为一种短期解决方法,您可以尝试在让XML解析器处理文件之前,对文件内容进行讨厌的正则表达式攻击来“修复”文件;有关示例,请参见。但是这并不是无懈可击的(它可能会弄乱comment/PI/CDATA节的内容);这不是一个可持续的解决办法。生成非XML的错误程序需要修复。如果生成XML,我会修复它。不幸的是,它来自一个政府机构。很糟糕,他们使用了非法的语法。哦,天哪。请尽可能大声地抱怨;生成格式不正确的XML是完全没有用的,任何东西都无法解析它。而未被替换的
&
通常是导致XSS安全漏洞的一般编码问题的标志。
<?php 

//Assign file names
$XMLFile = 'MyXML.xml';
$CSVFile = 'MyCSV.csv';

//take start time to calculate run-time
$time_start = time();

//Open PHP's XMLReader.  XMLReader opens each element in the XML one by one to keep memory use small.
$xml = new XMLReader(); 
$xml->open($XMLFile, null, 1<<19); 

//Loop through all elements.  Save all text from tags and attributes.
while ($xml->read()) {

    if($xml->nodeType == XMLReader::TEXT) { 
        $row[$xml->name] = $xml->value;
    }

    if($xml->hasAttributes)  {
        while($xml->moveToNextAttribute()) { 
            $row[$xml->name] = $xml->value;
        }
    }
}

//save the titles which should appear in CSV file.  All others will not be included.
$SavedRows = $row;
unset($row);

//Remove unnecessary columns i.e. datasource URLs
$RemoveColumn='xmlns:message, xmlns:common, xmlns:frb, xmlns:xsi, xsi:schemaLocation, xmlns:kf';
$RemoveColumns = explode(',', $RemoveColumn);

foreach($RemoveColumns as $key => $val) {
    $val = trim($val);
    unset($SavedRows[$val]);
}

//initiate all rows which should be included
foreach($SavedRows as $key => $val) {
    $row[$key] = '';
}

//Create csv file
$fp = fopen($CSVFile, 'w');

//Input the column headings as first row
fputcsv($fp, array_keys($row), ',');

// Start 2nd loop through XML.
$xml = new XMLReader(); 
$xml->open($XMLFile, null, 1<<19); 

while ($xml->read()) {

    //Determine if tag is empty (An empty tag will contain data) Non empty tags contain series information.
    $Output = $xml->isEmptyElement;

    //Take data from non empty XML tags
    if($xml->nodeType == XMLReader::TEXT) { 
        if(isset($SavedRows[$xml->name])) {
            $row[$xml->name] = $xml->value;
        }
    }

    //take data from XML tag attributes
    if($xml->hasAttributes)  {
        while($xml->moveToNextAttribute()) { 
            if(isset($SavedRows[$xml->name])) {
                $row[$xml->name] = $xml->value;
            }
        }
    }

    //If tag is empty, assume it is data and write row to file.
    if($Output) {
        fputcsv($fp, array_values($row), ',');
    }

}

//Close file handle
fclose($fp);

//Calculate runtime
$time_end = time();
$time = $time_end - $time_start;

 echo "Complete.  Runtime: $time seconds";

 ?>
xmlParseEntityRef: no name