我试图开始使用XMLReader来处理大型XML文件,但是当我尝试运行以下代码时,我收到一个奇怪的HTTP 400错误请求:
<?php
$reader = new XMLReader ();
$reader->open ( "testfile.xml" );
while ( $reader->read () ) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT) :
echo "<" . $reader->name . "> <br>";
break;
case (XMLREADER::TEXT) :
if ($reader->hasValue) {
echo $reader->value . "<br>";
}
break;
}
}
$reader->close();
?>
我也尝试过这种方式并获得相同的400 Bad Request错误:
<?php
$reader = new XMLReader ();
$reader->open ( "testfile.xml" );
while ( $reader->read() ) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT) :
echo "<" . $reader->name . "> <br>";
$reader->read();
if (($reader->nodeType == XMLREADER::TEXT) && $reader->hasValue) {
echo $reader->value . "<br>";
}
break;
}
}
$reader->close();
?>
在这两种情况下,当我评论echo reader->value ."<br>";
时,错误就会消失。 Apache错误日志没有显示任何内容。此外,尽管有400错误,页面仍然按照预期的元素和文本值创建和呈现(即,代码似乎有效,它也只是给出了HTTP错误)。
值得注意的是,它似乎在一个小而简单的测试XML文件上没有错误,只有一个根和一个带有文本的子元素。它只适用于我实际上打算处理的更大更复杂的XML文件,我收到错误。
提前感谢您的帮助!
答案 0 :(得分:0)
如果其他人碰到这个问题,我发现我需要使用htmlspecialchars()
来逃避这个价值。我改变了:
echo $reader->value . "<br>";
到
echo htmlspecialchars($reader->value, ENT_XML1, 'UTF-8') . "<br>";
猜测XML中必须存在一些浏览器试图解释的html导致400错误。