我在php中有一个创建XML文件的脚本。
$xml1 = "<?xml version='1.0' encoding='utf-8'?>\n";
$xml1 .= "\t<invoices>\n";
$xml1 .= "\t\t<journal>\n";
我需要添加一个架构链接到&#34;发票&#34;这样XML输出如下所示:
<invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd">
无论我尝试什么,我总是收到错误,并且不会创建XML文件。我怎样才能解决这个问题,或者在哪里可以找到有关如何正确插入所需模式链接的信息。
到目前为止,我所尝试的是添加不同解决方案的链接,包括&#39;或&#34;
$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd">\n";
$xml1 .= "\t<invoices 'xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"'>\n";
谢谢
ADDON
使用您的解决方案打开创建的文件时出现以下错误:
$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation=\"http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd\">\n";
XML解析错误:前缀未绑定到命名空间
<invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd">
--------^
解决方案:
以下代码是我的解决方案:
$xml1 = "<?xml version='1.0' encoding='utf-8'?>\n";
$xml1 .= "\t<invoices xmlns='http://www.w3schools.com' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd'>\n";
$xml1 .= "\t\t<journal>\n";
答案 0 :(得分:1)
不要尝试通过字符串连接创建xml。你会很难做到这一点。使用指定的php api创建xml文档。
以下是创建invoices.xml
。
/* create a dom document with encoding utf8 */
$domtree = new DOMDocument('1.0', 'UTF-8');
/* create the root element of the xml tree */
$xmlRoot = $domtree->createElement("xml");
/* append it to the document created */
$xmlRoot = $domtree->appendChild($xmlRoot);
$invoices = $domtree->createElement("invoices");
$invoices->setAttribute('xsi:noNamespaceSchemaLocation', 'http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd');
$invoices = $xmlRoot->appendChild($invoices);
$journal = $domtree->createElement("journal");
$journal = $invoices->appendChild($journal);
$domtree->save("invoices.xml");
内容将是:
<?xml version="1.0" encoding="UTF-8"?>
<xml><invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"><journal/></invoices></xml>
附加组件:
根据您的评论和帖子编辑,我认为您只需在字符串中引用"
。
$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation=\"http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd\">\n";
答案 1 :(得分:1)
像xsi:noNamespaceSchemaLocation
这样的属性使用名称空间前缀。由于前缀a,假设它是命名空间http://www.w3.org/2001/XMLSchema-instance
。
需要定义命名空间,但如果使用DOM API的命名空间感知方法,则会定义它们。结尾带有后缀NS
。
$document = new DOMDocument();
$document->appendChild(
$document->createElement('invoices')
);
$document->documentElement->setAttributeNS(
// namespace
'http://www.w3.org/2001/XMLSchema-instance',
// attribute name including namespace prefix
'xsi:noNamespaceSchemaLocation',
// attribute value
'http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd'
);
$document->documentElement->appendChild(
$document->createElement('journal')
);
$document->formatOutput = TRUE;
输出:
<?xml version="1.0"?>
<invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd">
<journal/>
</invoices>
您可以看到生成的输出包含xmlns
属性,该属性定义xsi
前缀使用的nampespace。
浏览器中的XML视图通常会隐藏命名空间定义。检查源以在此处验证它。
您可以生成相同的XML使用字符串函数。如果这样做,请记住在需要时转义值。