使用php将架构链接包含到XML中

时间:2016-06-10 09:42:55

标签: php xml

我在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";

2 个答案:

答案 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使用字符串函数。如果这样做,请记住在需要时转义值。