【问题标题】:PHP DOM return as htmlPHP DOM 返回为 html
【发布时间】:2018-12-04 06:51:45
【问题描述】:

我有一个xml文件slider.xml,里面有html代码:

<?xml version="1.0" encoding="UTF-8"?>
<content>
    <title>Slider</title>
    <head>
        <script async="async" src='ws-custom/plugins/slider.js'></script>
        <script async="defer" src='ws-custom/plugins/functions.js'></script>
    </head>
    <footer>
        <script async="defer" src='ws-custom/plugins/jquery.js'></script>
    </footer>
</content>

在 PHP 中,我想: 1.加载它(使用simplexml、dom或其他更好的解决方案)并存储在一个变量$xml中; 2. 创建一个数组 $head 与 $xml->head->children(); 3.返回$head[0]和$head[1]的原始html代码。

我已尝试使用此代码:

$xml = simplexml_load_file('slider.xml');
$head = $xml->head->children();
foreach($head as $element){
    echo $element->asXML();
}

但它返回自闭合标签:

<script async="async" src="ws-custom/plugins/slider.js"/>
<script async="defer" src="ws-custom/plugins/functions.js"/>

这不是 W3C http://validator.w3.org/nu/ 的有效 html 代码

我也希望能够只写异步,即 因为它是有效的 html,但使用 simplexml 它不是有效的 xml。

非常感谢。 最好的问候。

【问题讨论】:

  • $xml = new DOMDocument(); 的目的是什么?你会立即覆盖变量,所以第一个赋值是没用的。

标签: php html xml dom


【解决方案1】:

我已经编辑了脚本,现在它可以完美运行了。 请注意第 6 行: $元素[] = null;

<?php
$xml = new DOMDocument();
$xml = simplexml_load_file('slider.xml');
$head = $xml->head->children();
foreach($head as $element){
    $element[] = null;
    echo $element->asXML().PHP_EOL;
}

【讨论】:

  • 使用 $anyDOMNode->ownerDocument 或 $head=new DOMDocument; 在 $head_dom 中转换 $head (simplexml) 怎么样? $head->loadXML($xml->asXML());它们看起来很干净,但我不明白如何应用它。
  • @LorenzoDeTomasi 这是你的解决方案:head->children(); foreach($head as $element){ $element[] = null;回声 $element->asXML().PHP_EOL; } ?> 告诉我
  • 完美。为什么 $element[] = null?
  • simplexml 没有标志来决定是否应用自闭标签,所以 PHP 考虑这个w3.org/TR/2008/REC-xml-20081126/#elemdecls,如果你声明一个元素为 null 或为空,则不会应用自闭标签
【解决方案2】:

SimpleXML 无法正确输出空标签,您应该改用DOMDocument(LIBXML_NOEMPTYTAG 在 SimpleXML 中不起作用)...

$xml = new DOMDocument('1.0');
$xml->load("slider.xml");
$head = $xml->getElementsByTagName("head");
$headScripts= $head[0]->getElementsByTagName("script");
foreach($headScripts as $element){
    echo $xml->saveXML($element, LIBXML_NOEMPTYTAG).PHP_EOL;
}

此代码获取一个起点(&lt;head&gt; 标记),因为您只想要第一个它使用 [0] 并在起点内找到 &lt;script&gt; 标记。

测试源给出的...

<script async="async" src="ws-custom/plugins/slider.js"></script>
<script async="defer" src="ws-custom/plugins/functions.js"></script>

【讨论】:

  • 好的,谢谢。如果脚本在更多标签(即页脚)中,如何仅在头部标签中选择?
  • 您可以将getElementsByTagName() 调用分层以获取标签内的标签。我已经更新了代码以限制这一点,但该原则也适用于其他结构。
  • 如果这有帮助,请考虑将其标记为已回答 (meta.stackexchange.com/questions/5234/…)。如果您的其他一些问题也已得到解决,您可能还想这样做。
  • 我怎样才能得到 $head[0]->childElements (as simplexml->children())?我找到了 $head[0]->childNodes,但它也返回空格和制表符。
  • 如果在调用$xml-&gt;load() 之前添加$xml-&gt;preserveWhiteSpace = false;,它将删除多余的空格,childNodes() 就可以了。如果您更喜欢使用 SimpleXML,您可以执行 $head2 = simplexml_import_dom($head[0]); 之类的操作,然后 $head2 是一个 SimpleXMLElement。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2013-10-10
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多