PHP爬虫写入XML报错:DOMNode::appendChild()参数类型错误
解决DOMNode::appendChild()的TypeError问题
嘿,这个错误我之前爬取数据生成XML时也踩过坑!问题核心很清晰:你直接把字符串传给了appendChild(),但这个方法只认DOMNode类型的对象,普通字符串根本不被它接受。
错误原因拆解
DOMDocument是基于节点树的XML处理API,不管是元素标签还是文本内容,都得是节点对象。你想把$data['img-code']这种字符串直接塞进去,自然会触发类型错误。
修复方案:用createTextNode()转成文本节点
你需要先把要写入的字符串转换成DOM文本节点,再把这个节点挂到对应的XML元素上。结合你的代码,完整的修复示例如下:
// 你的原始数据数组 $data = array( 'img-code' => $element->img, 'ean' => $eant, 'desc' => $description ); // 初始化DOMDocument $doc = new DOMDocument(); $doc->formatOutput = true; // 可选:让生成的XML格式化更美观 // 创建根节点(比如<products>) $root = $doc->createElement('products'); $doc->appendChild($root); // 创建单个商品节点 $product = $doc->createElement('product'); $root->appendChild($product); // 逐个处理数据字段:先创建元素,再创建文本节点,最后挂载 // 处理img-code $imgCode = $doc->createElement('img-code'); $imgCodeText = $doc->createTextNode($data['img-code']); $imgCode->appendChild($imgCodeText); $product->appendChild($imgCode); // 处理ean $ean = $doc->createElement('ean'); $eanText = $doc->createTextNode($data['ean']); $ean->appendChild($eanText); $product->appendChild($ean); // 处理desc $desc = $doc->createElement('desc'); $descText = $doc->createTextNode($data['desc']); $desc->appendChild($descText); $product->appendChild($desc); // 保存或输出XML $doc->save('output.xml'); // 或者直接输出:echo $doc->saveXML();
简化写法小技巧
如果觉得每次都写createElement+createTextNode太繁琐,可以封装个小函数:
function addElementWithText($doc, $parent, $tagName, $text) { $element = $doc->createElement($tagName); $element->appendChild($doc->createTextNode($text)); $parent->appendChild($element); } // 调用起来就简洁多了 addElementWithText($doc, $product, 'img-code', $data['img-code']); addElementWithText($doc, $product, 'ean', $data['ean']); addElementWithText($doc, $product, 'desc', $data['desc']);
这样就能完美避开那个类型错误,顺利把爬虫抓取的数据写入XML文件啦!
内容的提问来源于stack exchange,提问作者Jakub Jóźwiak
相关产品推荐
相关产品推荐

