【问题标题】:XML Creation in simplexml (php)在 simplexml (php) 中创建 XML
【发布时间】:2011-01-13 07:59:03
【问题描述】:

我尝试使用以下代码创建一个 XML 文件。

$xml = new SimpleXMLElement('<xml />');
while($rs = db_fetch_object($d_res)){
 $cmp = $xml->addChild('Company');
 $cmp->addChild('ID', $rs->nid);
 $cmp->addChild('Name', trim($rs->title));
 $cmp->addChild('Created', $rs->created);
 $cmp->addChild('Updated', $rs->changed);
}
header("Content-type: text/xml;charset=utf-8;");
print($xml->asXML());

但是当我尝试验证它时,我收到了以下警告

  1. 未找到 DOCTYPE!仅检查 XML 语法。
  2. 没有在文档级别声明字符编码。

如何清除它们? XML 是 here,使用的验证器是 validator.w3.org。

【问题讨论】:

    标签: php xml simplexml w3c-validation


    【解决方案1】:

    虽然这些是您可能会忽略的警告,但尝试修复它们确实是个好主意。

    第一条消息表明 xml 文件没有指定任何 DTD;第二个是指 xml 指令不包含任何编码属性这一事实。

    不幸的是,从 simplexml API 看来,这两个 API 似乎都无法添加(尽管我可能遗漏了一些东西,并不熟悉它)。我想是“简单”,它非常适合快速读取 xml 文件,但没有那么多生成 xml。你可能不得不转向一些稍微“重”的东西,比如XML_Serializer

    【讨论】:

    • 我建议使用常规包,例如 DOM 或 XMLWriter。
    【解决方案2】:

    您可以决定忽略这些警告。 XML 中既不需要 DOCTYPE 也不需要声明的字符编码。实际上,大多数 XML 文档不包含 DOCTYPE。

    DOCTYPE 用于文档验证,这意味着存在正式描述存在哪些元素和属性可以存在于您的文档中,并且可以检查您的文档不包含任何其他内容(在在这种情况下它将变为无效)。除非您关心这一点并准备开发、托管和维护您自己的 DOCTYPE 规范,否则请忽略该警告。

    大多数时候,XML 的创建者和消费者关心格式良好,这意味着文档遵守 XML 需要的外观规则(没有交叉嵌套的标签,所有标签必须关闭,正确转义的内容)。否则,您的文档就会损坏 - 但这里不是这种情况。

    通过在文档顶部包含一个表示编码的 XML 声明来修复字符编码警告:

    <?xml version="1.0" encoding="utf-8" ?>
    

    如果不包含它,XML 默认为“1.0 版”和“utf-8”。如果这就是你交付的东西,那么一切都很好。如果您提供其他内容,则必须包含该信息。

    【讨论】:

      【解决方案3】:

      您可以通过以下方式简单地创建 XML 根元素:

      $rootXml = new SimpleXMLElement("<!DOCTYPE your_root_xml_element SYSTEM 'URL_TO_DTD_SCHEME'><your_root_xml_element></your_root_xml_element>");
      ....
      echo $rootXml->asXML();
      

      这样您将获得下一个有效的 XML:

      <?xml version="1.0"?>
      <!DOCTYPE your_root_xml_element SYSTEM "URL_TO_DTD_SCHEME">
      <your_root_xml_element>
      </your_root_xml_element>
      

      【讨论】:

        【解决方案4】:
        $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?>');
        

        【讨论】:

        • $xml = new SimpleXMLElement('');
        • :: 这是声明...(Shakti Singh 错过了问号)|||然后 :: 这是文档的根标签(虽然不常见的是将根标签命名为 xml,但允许。
        【解决方案5】:
        `$xmlstr = '<?xml version="1.0" encoding="utf-8"?>
        <root>
        <Data>
            <Id>0475109067</Id>
            <Contact>
                <Name>Daya</Name>
                <FirstName>Star</FirstName>
                <Email>test@test.com</Email>
            </Contact>
        </Data>
        <Result>
            <Name></Name>
        </Result>
        </root>';
        
        $xml = new SimpleXMLElement($xmlstr); 
        $xml->Result->Name = 'Xmltestfile'; 
        $xml->asXML('test.xml');
        $xml->asXML();`
        

        此代码将创建一个名为 test 的 xml 文件

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          相关资源
          最近更新 更多