簡體   English   中英

PHP XMLWriter:我需要將哪些參數傳遞給XMLWriter :: writeDtdEntity來生成如上所述的嵌套實體DTD聲明?

[英]PHP XMLWriter: What parameters do I need to pass to XMLWriter::writeDtdEntity to generate a nested entity DTD declaration as described?

我想用XMLWriter在XML文檔的頂部生成一個嵌套的實體DTD聲明。 我開始只使用沒有XMLWriter的字符串構建代碼來說明所需的輸出:

<?php
$sXML = "<!DOCTYPE Example PUBLIC \"urn:example:example.org:20110823:Example\"\n";
$sXML .= "\"http://www.example.org/example.dtd\" [\n";
$sXML .= "<!ENTITY % nestedentity SYSTEM ";
$sXML .= "\"http://www.example.org/nestedentity.dtd\">\n";
$sXML .= "%nestedentity;\n";
$sXML .= "]>\n";

當前(所需)$ sXML輸出:

<!DOCTYPE Example PUBLIC "urn:example:example.org:20110823:Example"
"http://www.example.org/example.dtd" [
<!ENTITY % anentity SYSTEM "http://www.example.org/nestedentity.dtd">
%anentity;
]>

當前的XMLWriter $ sXML輸出(代碼如下):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Example
PUBLIC "urn:example:example.org:20110823:Example"
       "http://www.example.org/example.dtd" [
        <!ENTITY % anentity PUBLIC "" "http://www.example.org/nestedentity.dtd">
]>

如您所見,當前的XMLWriter代碼XML輸出存在以下問題:

  1. 嵌套實體引用為PUBLIC,而不是SYSTEM
  2. 在所需的SYSTEM標識符之前有一個空字符串
  3. 在關閉DOCTYPE聲明之前,不會內聯實體擴展字符串'%anentity;'。

所以,問題是,如何調用$oXMLWriter->writeDtdEntity ,以便顯示“Current(Desired) $sXML Output”部分中顯示的XML字符串(忽略純空格中的差異)?

當前的XMLWriter代碼:

<?php
$oWriter = new XMLWriter();
$oWriter->openMemory();
$oWriter->setIndent(true);
$oWriter->setIndentString("\t");
$oWriter->startDocument("1.0", "UTF-8");
$oWriter->startDtd('Example','urn:example:example.org:20110823:Example', 'http://www.example.org/example.dtd');
$oWriter->writeDtdEntity(
    'nestedentity',
    '%nestedentity;\n',
    true,
    null,
    'http://www.example.org/nestedentity.dtd'
);
$oWriter->endDtd();
$oWriter->endDocument();
$sXML = $oWriter->outputMemory();

嗯,我不是DTD的專家,但我注意到了一些錯誤:

只是一個簡短的例子:

$oWriter = new XMLWriter();
$oWriter->openMemory();
$oWriter->setIndent(true);
$oWriter->setIndentString("\t");
$oWriter->startDocument("1.0", "UTF-8");
    // use null for $publicID to force SYSTEM
    $oWriter->startDtd('Example', null, 'http://www.example.org/example.dtd');
    $oWriter->writeDTDEntity('foo', 'bar');
    $oWriter->endDtd();
$oWriter->endDocument();
$sXML = $oWriter->outputMemory();

結果如預期(注意SYSTEM而不是PUBLIC ):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Example
SYSTEM "http://www.example.org/example.dtd" [
    <!ENTITY foo "bar">
]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM