PHP - DOMDocument/DOMConfiguration
Posted
技术标签:
【中文标题】PHP - DOMDocument/DOMConfiguration【英文标题】: 【发布时间】:2012-01-10 12:12:46 【问题描述】:如here 所述,DOMConfiguration 尚未实现。我需要对命名空间进行规范化,这样只要提供了前缀,子元素中的命名空间就会移动到根元素。
有没有任何非正则表达式的方法来做到这一点?
不过,我不确定DOMConfiguration 是否可以做到这一点,但我什至无法尝试,如您所见。
也许有办法通过设置 libxml?
谢谢。
【问题讨论】:
为了澄清:DOMDocument::normalizeDocument
默认不会这样做?
你可以考虑使用 xslt
您当然可以通过DOMXPath 选择候选节点并使用标准DOM API 进行必要的更改。此外,您可以通过DOMDocument::load 等的第二个参数访问libxml settings(不确定它们是否会有所帮助,但您可以在此处指定它们)。
加载功能在这里似乎很有帮助。谢谢你。但是,我已经更改了应用程序,以非常严格的方式处理 DOM 上的命名空间。因此不再需要清理。另外:DOMDocument::normalizeDocument 只清理节点之间的空白字符,因此通过子节点的迭代不需要您检查文本节点。
@user498380:请添加您的解决方案作为答案(并接受它,是的,它有效;)) - 如果您有一些示例代码,也可以随意添加它,甚至如果只是示范,它通常会说一千多个单词。
【参考方案1】:
好吧,正如评论所说,我已经重写了我的代码,以处理 DOM 构建时的命名空间。其工作原理如下:
class Foo
const XMLNS = 'http://www.w3.org/2000/xmlns/';
/**
* Register a namespace with an optional prefix to the specified DOMElement.
*
* @param DOMElement $element
* @param string $namespaceUri
* @param string $prefix
*/
public static final function registerNS(DOMElement $element, $namespaceUri, $prefix=null)
Preconditions::checkNotEmpty($namespaceUri);
$name = "xmlns";
if (!empty($prefix))
$name .= ":$prefix";
$element->setAttributeNS(self::XMLNS, $name, $namespaceUri);
现在,每次(在这里说每次,为了让事情更容易)我添加一个元素作为另一个元素的子元素,我调用此方法并主要提供 documentElement 作为第一个参数,以将命名空间添加到根元素:
DOMDocument $doc = [...];
DOMElement $element = [...];
DOMElement $newChild = [...];
Foo::registerNS($doc->documentElement, $newChild->namespaceURI, $newChild->prefix);
$element->appendChild($newChild);
【讨论】:
以上是关于PHP - DOMDocument/DOMConfiguration的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?