Php 解析大XML文件-具有未替换的html标记-引发错误
我正在尝试将数据从一个大的1GB XML文件导入WordPress。由于这是一个大文件,我做了一些研究,发现这将是最好的解决方案: 我实现了如下测试脚本: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
<?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。