用于谷歌地图的XML php:第行出错。。在列..:EntityRef:应为“;”

用于谷歌地图的XML php:第行出错。。在列..:EntityRef:应为“;”,php,xml,google-maps,entityreference,Php,Xml,Google Maps,Entityreference,我曾经在我的网站源中有一个很好的工作XML文件,用于谷歌地图。直到几天前,我才发现这个错误: 此页面包含以下错误: 第2行第10896列出错:EntityRef:应为“;” 下面是第一个错误之前的页面呈现 在此期间,我没有对php文件进行任何更改。还做了一些数据库检查,看起来一切正常,数据库连接正常 我读到一个常见的原因是使用&而不是&。但是在parseToXML中有一个替换函数,所以这不是我想的原因 有什么建议吗 谢谢大家! 标记 使用为工作设计的各种工具生成XML要比手动写出字符串容易

我曾经在我的网站源中有一个很好的工作XML文件,用于谷歌地图。直到几天前,我才发现这个错误:

此页面包含以下错误: 第2行第10896列出错:EntityRef:应为“;” 下面是第一个错误之前的页面呈现

在此期间,我没有对php文件进行任何更改。还做了一些数据库检查,看起来一切正常,数据库连接正常

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

有什么建议吗

谢谢大家!

标记


使用为工作设计的各种工具生成XML要比手动写出字符串容易得多,也更可靠。PHP有DOMDocument类,这使得类似这样的任务非常简单,并且需要更少的代码行-/ 如果文本内容包含V形符号或其他字符,它还具有不结巴的优点

<?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');
?>

@CBroe@Kevin,哇,太好了,你发现了这个。事实上,在过去几天里,我们在数据库中找到了一个条目。用户当天在descrip字段中添加了一个文本,其中包含&符号。这将终止XML文件输出。我现在也将parseToXML应用于该描述行,解决了这个问题


@Nigel Ren和所有人都会同意我现在使用的有点不可靠。开放和诚实,会形容我的整个网站设置为摇摇欲坠:-。不过,我们将研究您的建议,以便进一步改进。现在,非常感谢大家

我建议使用适当的api来生成XML,他们更了解XML的局限性,并且比您可能输入的数据更有可能正确编码数据。是的,这就是为什么手动创建XML不可靠的原因,最好使用DOMDocument或SimpleXML,但无论如何,可能是描述有问题,打破了标记您正在应用parseToXML函数htmlspecialchars存在,顺便说一句。仅用于名称和地址字段,但不用于描述…我不知道您有什么类型的数据,但描述字段有时可能包含符号,听起来不那么牵强也许…
<?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');
?>