我正在研究一些PHP,使用DOM扩展从数据库创建XML。
基本上,我需要创建一个NameSpace并为其添加3个属性:
<NameSpaceName xmlns="uri:xxx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="uri:xxx">
我写的完整代码如下:
include_once("includes/connect.php");
$sql = ("SELECT * FROM tableName");
$query = mysql_query($sql) or die("Error: " . mysql_error());
// create a new XML document
$doc = new DomDocument('1.0', 'UTF-8');
// create root node
$root = $doc->createElementNS('uri:xxx', 'PayerRecords');
$root = $doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xsi:schemaLocation', 'uri:xxx');
// process one row at a time
while($row = mysql_fetch_assoc($query)) {
// add node for each row
$occ = $doc->createElement('Content');
$occ = $root->appendChild($occ);
// add a child node for each field
foreach ($row as $fieldname => $fieldvalue) {
$child = $doc->createElement($fieldname);
$child = $occ->appendChild($child);
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
} // foreach
} // while
// get completed xml document
$xml_string = $doc->saveXML();
echo $xml_string;
但是当我执行上述操作时,我收到了这个错误:
致命错误:未捕获的异常 带有消息'Namespace'的'DOMException' 错误'in xml.php:21 堆栈跟踪:#0 xml.php(21): DOMElement-&gt; setAttributeNS('http://www.w3.o ...','xsi:schemaLocat ...', 'uri:xxx ...')#1 {main}抛出 在 xml.php 在第21行
第21行是第二个'setAttributeNS'行。
谁能看到我哪里出错?
答案 0 :(得分:17)
schemaLocation未在名称空间http://www.w3.org/2000/xmlns/
中声明,而是在http://www.w3.org/2001/XMLSchema-instance
<?php
// create a new XML document
$doc = new DomDocument('1.0', 'UTF-8');
// create root node
$root = $doc->createElementNS('http://xxx', 'PayerRecords');
$root = $doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$root->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation', 'http://xxx');
echo $doc->savexml();
打印
<?xml version="1.0" encoding="UTF-8"?>
<PayerRecords xmlns="http://xxx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xxx"/>
答案 1 :(得分:3)
我没有第一次得到它所以我更详细地发布了我的答案。也许有人觉得这很有帮助。
// create DOM document
$xml = new DomDocument('1.0', 'UTF-8');
// create root element
$el = $xml->createElementNS('http://namespaceA/url/here/', 'rootelement');
// to be able to add new namespaces we must first add namespace 'xsi'
// third parameter is important (use your main namespace with .xsd)
$root->setAttributeNS(
'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation',
'http://namespaceA/url/here/ http://namespaceA/xsdfile/here.xsd');
// add new namespace
$el->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:namespaceB',
'http://namespaceB/url/here/');
// add root element to DOM
$xml->appendChild($el);
此邮件存档消息非常有用:http://www.mail-archive.com/php-general@lists.php.net/msg135362.html。
答案 2 :(得分:2)
用
代替第21行$root->setAttributeNS(
'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation',
'http://xxx http://xxx/xxx.xsd'
);
xsi:schemaLocation
未在http://www.w3.org/2000/xmlns/或您的命名空间中定义,而是在xsi
中定义。所以你必须使用(完整的)xsi
命名空间uri作为第一个参数。
和:您无需拨打setAttributeNS()
两次:上面的一行会生成xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
和xsi:schemaLocation="http://xxx http://xxx/xxx.xsd"
属性。