在php中编写xml文件时解析字符串错误

时间:2014-07-29 06:13:52

标签: php xml

我正在用php代码编写一个站点地图文件。我能够根据要求正确地编写文件。但是我想将命名空间标签添加到xml文件的起始节点,我试着通过代码来做。但是得到了以下错误

Uncaught exception Exception with message 'String could not be parsed as XML'

以下是我的xml结构

<urlset>
    <url>
      <loc>url1</loc>
    </url>
..
..
</urlset>

父节点下有多个url片段作为urlset。我想将sitemaps的命名空间标签添加到urlset节点。这是我唯一无法做到的事情.Xml文件相当大,我无法做到手动..

以下是我的xml格式代码

<?php

     //Create Database connection
  $mysqli = new mysqli('localhost', 'user', 'pass', 'dbname');

   if(mysqli_connect_errno()) {
      echo "Connection Failed: " . mysqli_connect_errno();
      }
    /* if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
    } else {
        printf("Current character set: %s\n", $mysqli->character_set_name());
    }
    */
 $xml = new SimpleXMLElement('<xml/>');
    for ($i = 0; $i < 2; $i++) {
    // used to be: $query='select tablecolname1 from tablename limit 10000';
    $start = $i * 50000;
    $query = "select Siteurl from tablename limit $start, 50000";
$result = mysqli_query($mysqli,$query);  

//Create SimpleXMLElement object
$xml = new SimpleXMLElement('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
while($row = mysqli_fetch_array($result)) {
        $mydata = $xml->addChild('url');
$mydata->loc=$row['Siteurl'];
//htmlentities(strip_tags($mydata->loc=$row['Siteurl']), ENT_COMPAT,'utf-8');
    }
    // used to be: $fp = fopen("folder/file2.xml","wb");
    $fp = fopen("site/sitemap$i.xml","wb");
    fwrite($fp,utf8_encode($xml->asXML()));
    fclose($fp);
}


    $xml = new SimpleXMLElement('<urlset/>');

    ?>

请指导我如何将命名空间标记添加到urlset标记..

1 个答案:

答案 0 :(得分:0)

SimpleXMLElement期望根据documentation作为参数“格式良好的XML字符串”。 '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'不是这样的字符串。

您可以(至少)以两种(简单)方式从PHP构建XML:

  • 只能通过回显XML文件中所需的内容(包含标签):

    header('Content-Type:text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<urlset xmlns="...">';
    ...
    echo '</urlset>';
    
  • 或使用SimpleXML对象并构建DOM树(参见documentation中的示例#10):

    header('Content-Type:text/xml');
    $xml=new SImpleXMLElement('<xml/>');
    $urlset=$xml->addChild('urlset');
    $urlset->addAttribute('xmlns','...');
    ...
    echo $xml->asXML();