PHP DOM:更改现有 DOMDocument 的文档类型
Posted
技术标签:
【中文标题】PHP DOM:更改现有 DOMDocument 的文档类型【英文标题】:PHP DOM: change doctype of existing DOMDocument 【发布时间】:2011-03-06 16:07:46 【问题描述】:当使用DOMImplementation::createDocument()
创建一个DOMDocument 时,您可以在构造函数中指定一个文档类型作为第三个参数。然后,此 doctype 会“绑定”到文档,您可以稍后使用 $document->doctype
检索它。
但是,这是一个只读属性(与编码和版本不同!)。
有没有办法改变现有 DOMDocument 对象的 doctype 属性?
我能想到的唯一解决方法是使用新的 doctype 创建一个新的 DOMDocument,然后导入然后复制旧文档中的内容。
【问题讨论】:
我想这是唯一的解决方案。 【参考方案1】:事实证明,在 php 中(因此,我猜是在 libxml 中),您可以像使用 $document->insertBefore()
和 $document->removeChild()
等方法的常规节点一样向现有文档添加和删除 DOMDocumentType 对象。
似乎工作正常 - 更改它会更改 $document->doctype 值和所有内容。虽然它没有记录,并且与 W3 DOM 标准相矛盾,后者说它不应该是可能的(至少在 DOM Level 2 中)。但是知道你可以在 PHP 中做到这一点很方便。
一个缺点是 savehtml() 不能“看到”新的文档类型,尽管 saveXML() 可以。
【讨论】:
确认!这没有以任何明智的方式格式化。不知道如何解决。使用 DOMImplementation::createDocumentType,对吗?我打算开始一个新问题,询问“我应该从哪里获得这个新的 DOMDocumentType 对象”,因为 DOMDocumentType 没有公共构造函数。然后我更深入地研究了 PHP DOM 文档并找到了 createDocumentType。所以我猜测这样做的方法是: $impl = new DOMImplementation(); $newDocType = $impl->createDocumentType("root-node-name", "publicID", "systemID");对吗?【参考方案2】:即使文档已经被填充,似乎也可以再次调用 $document->loadXML()。它擦除文档并重新生成它,但它是一种更改现有对象上的 doctype 变量的方法,并且新的 doctype 确实具有与我的其他解决方案不同的 HTML 表示形式。
【讨论】:
以上是关于PHP DOM:更改现有 DOMDocument 的文档类型的主要内容,如果未能解决你的问题,请参考以下文章