Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php simplexml\u导入\u dom在最后一个节点后丢失文本_Php_Simplexml_Domdocument - Fatal编程技术网

Php simplexml\u导入\u dom在最后一个节点后丢失文本

Php simplexml\u导入\u dom在最后一个节点后丢失文本,php,simplexml,domdocument,Php,Simplexml,Domdocument,我有来自WYSIWYG编辑器的HTML,所以我无法控制它附带的HTML。我需要解析以创建PDF 我创建一个DomDocument并加载HTML并将其传递给simpleXML,因为它更易于处理。 但我时不时地会释放文本,因为它设置在最后一个HTML元素之后 // text to import $text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong> Lore

我有来自WYSIWYG编辑器的HTML,所以我无法控制它附带的HTML。我需要解析以创建PDF

我创建一个DomDocument并加载HTML并将其传递给simpleXML,因为它更易于处理。 但我时不时地会释放文本,因为它设置在最后一个HTML元素之后

// text to import
$text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong>
        Lorem ipsum dolor sit amet, consetetur.<br \/><br \/><strong>Lorem ipsum 
        dolor sit amet, consetetur</strong><ul><li>Lorem ipsum dolor sit amet, consetetur
        <\/li><li>Lorem ipsum dolor sit amet, consetetur<\/li><li>Lorem ipsum 
        dolor sit amet, consetetur<\/li><li>Lorem ipsum dolor sit amet, consetetur
        <\/li><\/ul>Text after last node";

// Load text in dom and pass it to simplexml
$dom = new DOMDocument();
$dom->loadHTML($text);
$dom->recover = true;
if ($dom) {
    $sxml = simplexml_import_dom($dom);
    unset($dom);
    if ($sxml) {
        $this->parseHtmlContent($sxml->children());
    }
}
//要导入的文本
$text=“text beginningLorem ipsum door sit amet,consetetur
同侧盲盲蝽(Lorem ipsum dolor sit amet,consetetur.同侧盲蝽
多尔塞特,康塞特
  • Lorem ipsum多尔塞特,康塞特
  • 同侧眼珠,同侧眼珠
  • 同侧眼珠 多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着 最后一个节点后的文本”; //在dom中加载文本并将其传递给simplexml $dom=新的DOMDocument(); $dom->loadHTML($text); $dom->recover=true; 如果($dom){ $sxml=simplexml\u import\u dom($dom); unset($dom); 如果($sxml){ $this->parseHtmlContent($sxml->children()); } }
所以“最后一个节点后的文本”在途中丢失了,我不知道该怎么办


如何防止这种情况发生?

最后一个节点后的文本与该节点处于同一级别。结构如下:

    object(SimpleXMLElement)#2 (1) {
      ["body"]=>
      object(SimpleXMLElement)#3 (2) {
        ["p"]=>
        string(63) "Text beginnning
            Lorem ipsum dolor sit amet, consetetur."
        ["ul"]=>
        object(SimpleXMLElement)#4 (1) {
          ["li"]=>
          array(4) {
            [0]=>
            string(47) "Lorem ipsum dolor sit amet, consetetur
            "
            [1]=>
            string(38) "Lorem ipsum dolor sit amet, consetetur"
            [2]=>
            string(46) "Lorem ipsum
            dolor sit amet, consetetur"
            [3]=>
            string(47) "Lorem ipsum dolor sit amet, consetetur
            "
          }
        }
      }
    }
因此body节点包含其他节点和一个字符串。要获取body节点下的字符串,您必须调用
\uuuuToString
方法:

$text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong>
        Lorem ipsum dolor sit amet, consetetur.<br \/><br \/><strong>Lorem ipsum
        dolor sit amet, consetetur</strong><ul><li>Lorem ipsum dolor sit amet, consetetur
        <\/li><li>Lorem ipsum dolor sit amet, consetetur<\/li><li>Lorem ipsum
        dolor sit amet, consetetur<\/li><li>Lorem ipsum dolor sit amet, consetetur
        <\/li><\/ul>Text after last node";

$text = stripcslashes($text);

// Load text in dom and pass it to simplexml
$dom = new DOMDocument();
$dom->loadHTML($text);
$dom->recover = true;

if ($dom) {
    $sxml = simplexml_import_dom($dom);
    unset($dom);
    if ($sxml) {
        var_dump((string) $sxml->body);
    }
}
$text=“text beginningLorem ipsum door sit amet,consetetur
同侧盲盲蝽(Lorem ipsum dolor sit amet,consetetur.同侧盲蝽
多尔塞特,康塞特
  • Lorem ipsum多尔塞特,康塞特
  • 同侧眼珠,同侧眼珠
  • 同侧眼珠 多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着 最后一个节点后的文本”; $text=stripcslashes($text); //在dom中加载文本并将其传递给simplexml $dom=新的DOMDocument(); $dom->loadHTML($text); $dom->recover=true; 如果($dom){ $sxml=simplexml\u import\u dom($dom); unset($dom); 如果($sxml){ 变量转储((字符串)$sxml->body); } }
有关更多信息,请参阅:


SimpleXML没有文本节点的任何表示,实际上除了元素和属性之外,没有其他任何表示。您可以使用字符串CAST(<代码>(string)$SimeXMLIObjultObj/<代码>)获得元素(或属性)的完整字符串内容,但这很少是HTML上下文中真正想要的——请考虑这个简单的HTML:

<代码>

在其

中有一些强调部分的文本 <> < SimpleXML >给出的>P><代码>元素的“文本内容”将是“代码>”在其中间的一些文本“< /代码> -<代码>”一个强调部分“<代码>代替了<代码> <代码>元素>

SimpleXML的文本处理只有在元素具有子节点或文本内容时才有意义,而不是两者的混合。对于作为数据序列化的XML来说,这是有意义的——具有包含文本值的元素的分层文档确实很容易以这种方式处理——但对于文本标记语言来说,它可以说是“被设计破坏了”


如果可以保证文档的某些部分将包含特定的HTML结构(例如示例中的
/
  • 序列),则可以使用SimpleXML仅解析该部分。可以使用DOM恢复该
    两侧的内容,并将其添加回输出中。

    请确保将整个内容包装在单个包含元素中:

    $dom->loadHTML('<div>' . $text . '</div>');
    
    $dom->loadHTML('.$text'');
    
    为什么不能按原样使用DOMDocument?SimpleXML不用于处理HTML。您可以使用
    $dom->textContent
    仅从中提取文本HTML@silkfire因为其他人在
    this->parseHTMLContent
    中构建了整个解析,我必须重写完整的代码。我只是想我可能缺少一个选项,无法将文本作为子节点获取。@spankmaster79如何解析HTML?也许我可以为您想出一个方法。
    $sxml->asXML()
    确实有正确的文本,但是文本并不像
    $sxml->children()
    那样被算作childnode。我来把斜线去掉。