php - 使用 DOMDocument 未使用 getElementsByTagName() 查找元素

标签 php xml dom

我正在尝试遍历多个 <LineItemInfo> <LineItems> 中包含的产品在 XML 中,我正在解析以提取产品 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

在 $element 而不是 $product 上导致我的脚本停止执行并且没有抛出服务器记录的任何错误。当您必须运行信用卡以确定它是否正常工作时,调试起来很痛苦。

最佳答案

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

我在测试脚本中运行了以下代码,它似乎对我有用。你能更具体地说明什么不起作用吗?除了创建文档的前两行之外,我完全使用了您的代码。您是否在 loadHTML() 上使用 loadXML()?有没有错误?

$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-"

关于php - 使用 DOMDocument 未使用 getElementsByTagName() 查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2073708/

相关文章:

javascript - 如何在粘贴时获取文本区域输入字段的新值?

c# - 如何将 Streamreader 数据转换为 XmlDocument?

javascript - 枚举由 Handlebars.js 生成的元素在第一页加载时不返回任何内容

php - 存储时间为 00 :00:00 的时间戳

php - 检查更新查询是否成功[PHP, mysqli]

php - 无法将内爆数组绑定(bind)到 mysql 准备好的语句中

php - HTML & 字符代码未加载到表单文本框中 -PHP

java - 如何在解析时忽略不在 XSD 架构中的元素

android - 在 TextView 中显示 3 个点或截断的任何其他方法

javascript - 设置 innerHTML 与使用 Javascript 设置值