我正在尝试遍历XML中正在解析的<LineItemInfo>
内的多个<LineItems>
产品,以便将产品ID拉出来并发送电子邮件并为每个产品执行其他操作。
问题在于它没有返回任何东西。我已经验证了XML数据是有效的,它确实包含必要的组件。
$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
var_dump($itemListObject->length);
var_dump($itemListObject);
var_dump
的输出是:
int(0)
object(DOMNodeList)#22 (0) {
}
这是我第一次搞乱这个,它花了我几个小时,但我无法弄清楚。任何建议都很棒。
修改
我的XML看起来像这样......除了标签多于ProductId
之外<LineItems>
<LineItemInfo>
<ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
</LineItemInfo>
<LineItemInfo>
<ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
</LineItemInfo>
</LineItems>
执行以下代码不会得到ProductId
$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
foreach ($itemListObject as $element) {
$product = $element->getElementsByTagName('ProductId');
$productId = $product->item(0)->nodeValue;
echo $productId.'-';
}
编辑#2
作为旁注,请致电
$element->item(0)->nodeValue
on $ element而不是$ product导致我的脚本执行停止并且不会抛出服务器记录的任何错误。当您必须运行信用卡以确定其是否正常运行时,调试很麻烦。
答案 0 :(得分:8)
DOMDocument的东西可能很难处理,因为print_r()
和var_dump()
等函数不一定像在普通数组和对象上那样执行(参见this comment在手册中。)
您必须使用文档节点的各种功能和属性来提取数据。例如,如果您有以下XML:
<LineItemInfo attr1="hi">This is a line item.</LineItemInfo>
您可以使用以下方式输出其中的各个部分:
$itemListObjects = $orderXML->getElementsByTagName('LineItemInfo');
foreach($itemListObjects as $node) {
echo $node->nodeValue; //echos "This is a line item."
echo $node->attributes->getNamedItem('attr1')->nodeValue; //echos "hi"
}
如果您有嵌套结构,则可以使用childNodes
属性执行基本相同的过程。例如,如果你有这个:
<LineItemInfo attr1="hi">
<LineItem>Line 1</LineItem>
<LineItem>Line 2</LineItem>
</LineItemInfo>
您可能会这样做:
$itemListObjects = $orderXML->getElementsByTagName('LineItemInfo');
foreach($itemListObjects as $node) {
if ($node->hasChildNodes()) {
foreach($node->childNodes as $c) {
echo $c->nodeValue .",";
}
}
}
//you'll get output of "Line 1,Line 2,"
希望有所帮助。
针对特定代码和XML进行编辑
我在测试脚本中运行了以下代码,它似乎对我有用。你能更具体地说明什么不起作用吗?我完全使用了您的代码,除了创建文档的前两行。您使用loadXML()
而非loadHTML()
吗?有什么错误吗?
$orderXML = new DOMDocument();
$orderXML->loadXML("
<LineItems>
<LineItemInfo>
<ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
</LineItemInfo>
<LineItemInfo>
<ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
</LineItemInfo>
</LineItems>
");
$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
foreach ($itemListObject as $element) {
$product = $element->getElementsByTagName('ProductId');
$productId = $product->item(0)->nodeValue;
echo $productId.'-';
}
//outputs "149593-149595-"
答案 1 :(得分:1)
XML标签往往是低驼峰式(或仅仅是“驼峰式”),即“lineItemInfo”,而不是“LineItemInfo”,而XML是区分大小写的,因此请检查。