0

这是 XML:

<Routes>
    <Route type="source">
        <Table>
            <Tablename>incoming</Tablename>
            <Fields>
                <Fieldsname ref="description" name="Route Name">description</Fieldsname>
                <Fieldsname name="CID Match">cidnum</Fieldsname>
                <Fieldsname name="DID Match">extension</Fieldsname>
                <Fieldsname ref="dest">destination</Fieldsname>
            </Fields>
        </Table>

    </Route>
</Routes>

然后我在 PHP 中对其进行实例化:

$doc    = new SimpleXMLElement('routingConfig.xml', null, true);

print_r($doc->Route[0])显示了这一点:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [type] => source
        )

    [comment] => SimpleXMLElement Object
        (
        )

    [Table] => SimpleXMLElement Object
        (
            [Tablename] => incoming
            [comment] => SimpleXMLElement Object
                (
                )

            [Fields] => SimpleXMLElement Object
                (
                    [Fieldsname] => Array
                        (
                            [0] => description
                            [1] => cidnum
                            [2] => extension
                            [3] => destination
                        )

                    [comment] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                )

                            [1] => SimpleXMLElement Object
                                (
                                )

                        )

                )

        )

)

注意根值如何具有@attributes数组。为什么$doc->Routes[0]->Table->Fields->Fieldsname没有@attributes?我意识到我可以通过它获得它attributes(),但是有没有办法让它包含在其中$doc

编辑 显然print_r()不显示数组/对象中的每个值,探索所有子对象等。或者除非请求(似乎它应该全部存储在) ,否则可能SimpleXMLElement不会返回它。$doc如果你这样做print_r($doc->Route[0]->Table->Fields->Fieldsname[0]);,它会返回

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ref] => description
            [name] => Route Name
        )

    [0] => description
)

这显示了我正在寻找的数据。但是如果我做一个print_r($doc->Route[0]->Table->Field);数据不会出现。

4

1 回答 1

1

SimpleXMLElement对象在 PHP 中做了一些非常高级的事情。它实现了 PHP 提供的许多“神奇”钩子,因此它可以在foreach()诸如“黑匣子”之类的情况下工作。因此,正因为如此,使用print_r()它会给你带来误导和不完整的信息。你不能依赖print_r()(或var_dump())一个SimpleXMLElement对象。

在 a 中调试结构的方法SimpleXMLElement是简单地查找您所追求的元素:例如isset($xmlnode->child)工作之类的东西。所以is_array($doc->Route[0]->Table->Fields->Fieldsname)会是真的。

于 2012-09-07T00:46:44.783 回答