使用DomDocument不使用getElementsByTagName()查找元素

Web*_*net 4 php xml dom

我正在尝试遍历XML中<LineItemInfo>包含的多个产品,<LineItems>我正在解析产品ID并发送电子邮件并为每个产品执行其他操作.

问题是它没有返回任何东西.我已经验证了XML数据是有效的,它确实包含必要的组件.

$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
var_dump($itemListObject->length);
var_dump($itemListObject);
Run Code Online (Sandbox Code Playgroud)

输出var_dump是:

int(0)
object(DOMNodeList)#22 (0) {
}
Run Code Online (Sandbox Code Playgroud)

这是我第一次搞乱这个,它花了我几个小时,但我无法弄清楚.任何建议都会很棒.

编辑:

我的XML看起来像这样......除了标签不仅仅是ProductId

<LineItems>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
</LineItems>
Run Code Online (Sandbox Code Playgroud)

执行以下代码不会得到ProductId

$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
foreach ($itemListObject as $element) { 
        $product = $element->getElementsByTagName('ProductId');
        $productId = $product->item(0)->nodeValue;
        echo $productId.'-';
}
Run Code Online (Sandbox Code Playgroud)

编辑#2

作为旁注,打电话

$element->item(0)->nodeValue
Run Code Online (Sandbox Code Playgroud)

on $ element而不是$ product导致我的脚本执行停止并且不会抛出服务器记录的任何错误.当您必须运行信用卡以查明其是否正常运行时,调试很麻烦.

zom*_*bat 8

DOMDocument的东西可能很难处理,因为诸如print_r()并且var_dump()不一定执行与普通数组和对象相同的函数(请参阅手册中的此注释).

您必须使用文档节点的各种功能和属性来提取数据.例如,如果您有以下XML:

<LineItemInfo attr1="hi">This is a line item.</LineItemInfo>
Run Code Online (Sandbox Code Playgroud)

您可以输出以下各项:

$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"
}
Run Code Online (Sandbox Code Playgroud)

如果您有嵌套结构,则可以使用该childNodes属性执行基本相同的过程.例如,如果你有这个:

<LineItemInfo attr1="hi">
  <LineItem>Line 1</LineItem>
  <LineItem>Line 2</LineItem>
</LineItemInfo>
Run Code Online (Sandbox Code Playgroud)

你可能会这样做:

$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,"
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

编辑特定代码和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-"
Run Code Online (Sandbox Code Playgroud)