【问题标题】:PHP DOMNode valuePHP DOMNode 值
【发布时间】:2012-08-14 07:38:46
【问题描述】:

我目前正在努力解决一个非常奇怪的问题。我有一个如下所示的 XML:

<A>
  <B>
    <C>
      <D>
       <E attribute="foo">
         This is a value
       </E>
      </D>
    </C>
  </B>
</A>

现在,当我执行 XPath-Query 并遍历结果时,我总是将值“这是一个值”作为节点 A 的值,这是不正确的(该值应该只是节点 E 的值)。

这里出了什么问题?好像说 A->childNodes 时,它递归地获取所有 childNodes 并覆盖值。

任何帮助将不胜感激:)

【问题讨论】:

  • 你有没有机会在浏览器上回显这个?尝试查看源代码,你会明白为什么你会看到这种行为...... ;-)
  • 如何遍历您的 XML? DOM?请您的 XPath 查询。

标签: php xml dom xpath


【解决方案1】:

$node->nodeValue 的处理程序是 dom_node_node_value_read,它在 ext/dom/node.c 中实现。
它调用libxml2's xmlNodeGetContent() 函数。

读取一个节点的值,可以是该节点直接携带的文本,如果是TEXT节点也可以是该节点子节点携带的值的聚合字符串(TEXT和ENTITY_REF) .实体引用被替换。
即对于 DOMElement,您可以将所有子元素的所有值作为一个字符串。
如果我没记错的话,http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1841493061 不是这么说的……但这就是它在 libxml2/php 中的实现方式

【讨论】:

  • 有趣,我认为问题在于它有效地调用了$node-&gt;C14N() 并返回了包含的全部内容标签,然后浏览器在渲染时吃掉了标签。但听起来 libxml 在这里做了一些事情,呃,unexpected。看起来您必须检查 $node instanceof DOMText 才能使其“安全”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-09-08
  • 2019-02-10
  • 2011-01-15
  • 2011-06-04
  • 2011-05-23
相关资源
最近更新 更多