用于谷歌地图的 XML php:在线错误。在列 ..: EntityRef: expecting ';'

XML php for google maps: error on line .. at column ..: EntityRef: expecting ';'

提问人:Mark Geenevasen 提问时间:7/15/2020 最后编辑:meewogMark Geenevasen 更新时间:7/15/2020 访问量:677

问:

我曾经在我的网站上有一个很好的工作XML文件(谷歌地图的来源)。直到几天前才出现此错误:

此页面包含以下错误: 第 2 行第 10896 列出错:EntityRef:预期为“;” 下面是页面的渲染,直到第一个错误。

在那段时间里,我没有对 php 文件进行更改。还做了一些数据库检查,一切似乎都井井有条(数据库连接工作正常)。

我读到一个常见的原因是使用 & 而不是 & 。但是在其中有一个替换功能,所以这不可能是我所想的原因。parseToXML

有什么提示吗?

谢谢!

马克

require("credentials.php");

function parseToXML($htmlStr)
{
    $xmlStr=str_replace('<','&lt;',$htmlStr);
    $xmlStr=str_replace('>','&gt;',$xmlStr);
    $xmlStr=str_replace('"','&quot;',$xmlStr);
    $xmlStr=str_replace("'",'&#39;',$xmlStr);
    $xmlStr=str_replace("&",'&amp;',$xmlStr);
    return $xmlStr;
}

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, name, address, lat, lng, descrip FROM people";
$result = $conn->query($sql);

header("Content-type: text/xml");

// Start XML file, echo parent node
echo '<markers>';
$ind=0;
// Iterate through the rows, printing XML nodes for each
 while($row = $result->fetch_assoc()) {
     // Add to XML document node
     echo '<marker ';
     echo 'id="' . $row['id'] . '" ';
     echo 'name="' . parseToXML($row['name']) . '" ';
     echo 'address="' . parseToXML($row['address']) . '" ';
     echo 'lat="' . $row['lat'] . '" ';
     echo 'lng="' . $row['lng'] . '" ';
     echo 'descrip="' . $row['descrip'] . '" ';
     echo '/>';
     $ind = $ind + 1;
 }

// End XML file
echo '</markers>';
php xml google-maps entityreference

评论

1赞 Nigel Ren 7/15/2020
我建议使用适当的 api 来生成 XML,他们更了解 XML 的局限性,并且比您可能输入的更有可能正确编码数据。
0赞 Kevin 7/15/2020
是的,这就是为什么当您手动创建 XML 时它会很不稳定,最好使用 或 ,但无论如何,(也许)描述中断标记有问题DOMDocumentSimpleXML
1赞 CBroe 7/15/2020
您仅将函数(存在,顺便说一句)应用于 和 字段,而不是......我不知道你那里有什么样的数据,但描述字段可能偶尔包含与号,听起来可能不那么牵强......parseToXMLhtmlspecialcharsnameaddressdescrip

答:

0赞 Professor Abronsius 7/15/2020 #1

与手动写出字符串相比,使用为作业设计的各种工具生成 XML 要容易得多,也更可靠。PHP有一个类,它使这样的任务变得非常简单,并且需要更少的代码行;-/ 如果文本内容包含 V 形或其他字符,它还具有不会卡顿的好处DOMDocument

<?php
    require 'credentials.php';
    $conn = new mysqli( $servername, $username, $password, $dbname );

    $sql = 'select id, name, address, lat, lng, descrip from people';
    $result = $conn->query( $sql );
    
    
    # generate new DOMDocument & set properties
    $dom = new DOMDocument;
    $dom->formatOutput = true;
    $dom->xmlStandalone = true;
    
    # create the root node and add to the DOM
    $root=$dom->createElement('markers');
    $dom->appendChild( $root ); 
    
    # for convenience it is quicker to iterate through this array to generate attributes
    # thse correspond to the column names / aliases from the sql query
    $attribs=[ 'id', 'name', 'address', 'lat', 'lng', 'descrip' ];
    
    # iterate through recordset, generate new node for each record
    while( $row = $result->fetch_object() ) {
        #add the new node to DOM
        $marker=$dom->createElement('marker');
        $root->appendChild( $marker );
        
        #add attributes
        foreach( $attribs as $attr ){
            $marker->setAttribute( $attr, $row->$attr );
        }
    }
    
    #save or echo?
    header('Content-Type: text/xml');
    echo $dom->saveXML();
    
    #$dom->save('/path/to/file.xml');
?>
0赞 Mark Geenevasen 7/15/2020 #2

@CBroe @Kevin,哇,太好了,你发现了这个。确实在过去几天中发现,在数据库中进行了一个条目。当天,一位用户在字段中添加了一个文本,其中包含 & 符号。这扼杀了 XML 文件输出。我现在也申请了那条线,解决了问题。descripparseToXMLdescrip

@Nigel 任和所有人都会同意我现在使用的东西有点不稳定。开放和傲慢,会将我的整个网站设置描述为“不稳定”:-)。不过,会研究您的建议,以进一步改进。现在,非常感谢大家!