0

我有以下 XML:

<?xml version="1.0"?>
<STATUS_LIST>
    <ORDER_STATUS SORDER_CODE="SO001" ASSOCIATED_REF="001">
        <INVOICES>
            <INVOICE INVOICE_CODE="???">SOMETHING</INVOICE>
        </INVOICES>
    </ORDER_STATUS>
</STATUS_LIST>

当我运行以下代码时:

$statuses = simplexml_load_string($result); //Where $result is my XML

if (!empty($statuses))
{
    foreach ($statuses as $status)
    {
        foreach ($status->INVOICES as $invoice)
        {
            echo (string)$invoice->attributes()->INVOICE_CODE;   
        }
    }
}

我单步执行此代码,我可以看到针对的属性,ORDER_STATUS但我不到针对INVOICE. 但是,我可以看到SOMETHING发票的价值。

知道是什么原因造成的吗?

更新

经过一些测试,如果我将元素添加到元素中,我可以获得属性来显示INVOICE,所以如果我使用这个 xml 代替它会起作用:

<?xml version="1.0"?>
<STATUS_LIST>
    <ORDER_STATUS SORDER_CODE="SO001" ASSOCIATED_REF="001">
        <INVOICES>
            <INVOICE INVOICE_CODE="???"><TEST>tester</TEST></INVOICE>
        </INVOICES>
    </ORDER_STATUS>
</STATUS_LIST>

所以它必须有一个内部元素来获取属性!?

4

2 回答 2

2

根据这个过去的问题,“SimpleXML 不允许同一元素上的属性和文本。” 这太荒谬了,我找不到任何关于这个事实的官方报道,但这似乎是真的。瘸。它是有效的 XML。我知道 Perl SimpleXML 读起来很好。

于 2013-10-17T09:47:31.300 回答
1

您的问题与没有内容的元素无关,您只是将循环定义稍有错误。

当您编写时foreach ($status->INVOICES as $invoice),SimpleXML 将遍历$status被调用元素的每个子元素INVOICES;在这种情况下,总会有一个这样的元素。但是您真正想要的是遍历该元素的所有节点- 各个INVOICE节点。

为此,您可以使用以下方法之一:

  • foreach ($status->INVOICES->children() as $invoice)(循环遍历第一个元素的所有子节点,仅在本例中为INVOICES元素)
  • foreach ($status->INVOICES[0]->children() as $invoice)(相同,但更明确地选择第一个INVOICES节点)
  • foreach ($status->INVOICES[0] as $invoice)(实际上也是如此:因为您专门选择了一个节点,然后要求循环,SimpleXML 假定您想要它的子节点;这就是为什么foreach($statuses as $status)作为外循环工作的原因)
  • foreach ($status->INVOICES->INVOICE as $invoice)(仅遍历称为 的子节点INVOICE,恰好是所有子节点)

就个人而言,我会重写您的示例循环,如下所示:

foreach ($statuses->ORDER_STATUS as $status)
{
    foreach ($status->INVOICES->INVOICE as $invoice)
    {
        echo (string)$invoice['INVOICE_CODE'];   
    }
}

这是一个现场演示,以证明这是有效的。

于 2013-10-19T21:32:18.207 回答