【问题标题】:PHP - DOMDocument/DOMConfigurationPHP - 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:请添加您的解决方案作为答案(并接受它,是的,它有效;)) - 如果您有一些示例代码,也可以随意添加它,甚至如果只是示范,它通常会说一千多个单词。

标签: php dom namespaces normalization


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2011-02-20
    • 1970-01-01
    • 2011-07-26
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多