Php 解析大XML文件-具有未替换的html标记-引发错误

Php 解析大XML文件-具有未替换的html标记-引发错误,php,xml,wordpress,Php,Xml,Wordpress,我正在尝试将数据从一个大的1GB XML文件导入WordPress。由于这是一个大文件,我做了一些研究,发现这将是最好的解决方案: 我实现了如下测试脚本: <?php require('vendor/autoload.php'); // Convenience method for creating a file streamer with the default parser $streamer = Prewk\XmlStringStreamer::createStringWalker

我正在尝试将数据从一个大的1GB XML文件导入WordPress。由于这是一个大文件,我做了一些研究,发现这将是最好的解决方案:

我实现了如下测试脚本:

<?php
require('vendor/autoload.php');

// Convenience method for creating a file streamer with the default parser
$streamer = Prewk\XmlStringStreamer::createStringWalkerParser("mybigfile.xml");


$count = 1;
while ($node = $streamer->getNode()) {    
    echo $node . '<br>';
    
    $simpleXmlNode = simplexml_load_string($node);    

    if( $simpleXmlNode AND $simpleXmlNode->getName() == 'book' )
    {
        var_dump( $simpleXmlNode );

        echo  (string)$simpleXmlNode->name. '<br>';        
        
        echo $count++. '<br>';    
    }    
    
    if( $count == 20 ) die;
}
<?xml version="1.0" encoding="UTF-8"?>
<source>
    <lastBuildDate>2021-04-24</lastBuildDate>
    <owner>Blahblah</owner>

    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>

    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>


    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>

</source>        
getNode()){
回显$node。“
”; $simpleXmlNode=simplexml\u load\u字符串($node); 如果($simpleXmlNode和$simpleXmlNode->getName()=='book') { 变量转储($simpleXmlNode); echo(字符串)$simpleXmlNode->name.“
”; echo$count++.
; } 如果($count==20)死亡; }
最多10个节点,一切都正常。但是在那之后,有一个
元素,在它里面,有一些未被转换的HTML标记(例如:
)。由于这些HTML标记,它抛出了错误

我的XML文件看起来有点像这样:

<?php
require('vendor/autoload.php');

// Convenience method for creating a file streamer with the default parser
$streamer = Prewk\XmlStringStreamer::createStringWalkerParser("mybigfile.xml");


$count = 1;
while ($node = $streamer->getNode()) {    
    echo $node . '<br>';
    
    $simpleXmlNode = simplexml_load_string($node);    

    if( $simpleXmlNode AND $simpleXmlNode->getName() == 'book' )
    {
        var_dump( $simpleXmlNode );

        echo  (string)$simpleXmlNode->name. '<br>';        
        
        echo $count++. '<br>';    
    }    
    
    if( $count == 20 ) die;
}
<?xml version="1.0" encoding="UTF-8"?>
<source>
    <lastBuildDate>2021-04-24</lastBuildDate>
    <owner>Blahblah</owner>

    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>

    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>


    <book>
        <name><![CDATA[Once upon a time in coma]]></name>
        <price><![CDATA[USD 20]]></price>                      
        <listDate><![CDATA[2021-04-02]]></listDate>
        <description><![CDATA[<div>This is a great book..</div>]]></description>
    </book>

</source>        

2021-04-24
布拉布拉赫
这是一本好书。]]>
这是一本好书。]]>
这是一本好书。]]>

内容并不总是一样的,我只是给了你一个例子。我相信XML读者很难理解哪些是XML元素,因为
标记中有HTML元素。如何将HTML标记动态转换为HTML实体?

尝试将
expectGT
选项设置为
true
。看一看

我想你把这个问题误诊了。任何XML解析器都不会在理解格式良好的CDATA节时遇到问题。如果您告诉我们错误消息是什么,我们可能有机会帮助您。我不熟悉此解决方案,也不清楚您的确切错误消息是什么。但是,您是否尝试从此处将
expectGT
选项设置为
true
?对不起,可能我说得太快了。我只是看了一下您正在使用的库的源代码。在我看来,这就像有人在周末搞砸了一样。它很可能无法解析此输入。@MichaelKay谢谢。它抛出了如下解析错误:
simplexml\u load\u string():实体:第44行:解析错误:CData节未完成divp
@IhorVyspiansky谢谢!这解决了我的问题!你能把它作为一个答案贴出来吗?这样我就可以把它标记为被接受的答案谢谢。这解决了我的问题。我很高兴它帮助了你。这很奇怪,你必须设置一个特定的选项,使它接受格式良好的XML。