【问题标题】:simplexml_load_string() != simplexml_import_dom()?simplexml_load_string() != simplexml_import_dom()?
【发布时间】:2023-04-09 10:49:01
【问题描述】:

如果我使用 DOMDocument::loadHTMLFile() 加载 HTML 页面,然后将其传递给 simplexml_import_dom() 一切都很好,但是,如果我使用 $dom->saveHTML()DOMDocument 获取字符串表示,然后使用 simplexml_load_string(),我得到没有。实际上,如果我使用一个非常简单的页面,它会起作用,但是一旦有更复杂的页面,它就会失败,并且 PHP 日志文件中没有任何错误。

有人能解释一下吗?

这与 HTML 不是可解析的 XML 有关吗?

我试图在使用内容之前从格式化的 HTML 文本中去除 CR 和换行符,因为它们与内容无关,而是插入到 SimpleXMLElement 对象中,这相当乏味。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    Is it something to do with HTML not being parsable XML?

    是的! HTML 是一种不太严格的语法,因此 simplexml_load_string 不能单独使用它。这是因为simplexml 很简单,而 HTML 很复杂。另一方面,DOMDocument 被设计为能够读取复杂的 HTML 结构,这意味着由于它可以理解 HTML 并且simplexml 可以理解它,因此您可以弥合那里众所周知的差距。

    <!-- Valid HTML but not valid XML -->
    <ul>
        <li>foo
        <li>bar
    </ul>
    

    【讨论】:

    • 有点让你想尖叫。
    • 即使使用&lt;!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;(及以上版本),这也是无效的。只是让它被浏览器解释并不能使它成为有效的 html。
    • @Yoshi 去掉了&lt;i&gt;。举个老例子。无论如何,&lt;li&gt; 部分仍然很常见,我已经看到它被 Google 使用了。
    • 所以答案真的是遍历每个 SimpleXMLElement 元素并删除任何带有多余空白的文本节点?
    • @cwallenpoole 好的,删除了我的反对票。但是还是丑的不行! ;)
    【解决方案2】:

    HTML 可能是也可能不是有效的 XML。当您使用 loadHTMLFile 时,它​​不一定必须是格式良好的 xml,因为 DOM 是一种 HTML,因此规则不同,但是当您将字符串传递给 SimpleXML 时,它确实必须是格式正确的。

    【讨论】:

      【解决方案3】:

      如果我的问题正确,并且您只是希望输出中没有空格,则无需在此处使用 simplexml

      使用:DOMDocument::preservewhitespace 喜欢:

      $dom->preserveWhiteSpace = false;
      

      saveHTML 之前,你已经准备好了。

      【讨论】:

      • 嗯,不完全是。我需要使用“simplexml”来遍历内容。我想我可以使用 preserveWhiteSpace,然后将内容保存到文件中,然后重新加载它,但我认为从长远来看,我需要以编程方式解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多