6

好吧,我完全被难住了。我发现了类似的问题,但答案似乎不适用于我的具体问题。我已经断断续续地工作了好几天。

我在这里有这个 simplexml 对象(它实际上比这长得多,但我删除了所有无关的东西,所以你会真正看看它):

SimpleXMLElement Object
(
    [SubjectClassification] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Authority] => Category Code
                            [Value] => s
                            [Id] => s
                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Authority] => Subject
                            [Value] => Sports
                            [Id] => 54df6c687df7100483dedf092526b43e
                        )

                )

            [2] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Authority] => Subject
                            [Value] => Professional baseball
                            [Id] => 20dd2c287e4e100488e5d0913b2d075c
                        )

                )

        )

)

我通过对包含以下内容的变量执行 print_r 得到了这段代码:

$subjects->SubjectClassification->children();

现在,我想获取 subjectClassification 数组的所有元素。他们全部!但是当我这样做时:

$subjects->SubjectClassification;

或这个:

$subjects->SubjectClassification->children();

或者,如果我尝试通过循环获取所有数组元素,我得到的只是:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [Authority] => Category Code
            [Value] => s
            [Id] => s
        )

)

为什么?我怎样才能得到一切?

4

5 回答 5

1

由于 SimpleXML 重载 PHP 语法的程度,依赖于print_r找出 SimpleXML 对象中的内容或您可以用它做什么并不总是有帮助的。(我编写了几个调试函数,旨在更全面。)最终,参考应该是 XML 结构本身,以及 SimpleXML 如何工作的知识。

在这种情况下,从您提供的输出中可以看出,您所拥有的是一个元素列表,所有元素都称为SubjectClassification,并且所有同级元素都相互关联。所以你不想打电话$subjects->SubjectClassification->children(),因为这些节点没有孩子。

如果对底层 XML 结构没有更好的了解,很难说更多,所以我暂时保留这个不完整的答案。

于 2013-06-10T02:05:36.000 回答
1

您可以使用 xpath 来执行此操作。这是我发现的最简单和最有效的方法,并减少了对大量 for 循环等解决项目的需求。要获取您想要的所有节点,您可以使用:

如果你的 xml 是这样的:

<Subjects>
<SubjectClassification>
</SubjectClassification>
<SubjectClassification>
</SubjectClassification>
<SubjectClassification>
</SubjectClassification>
</Subjects>

然后,要获取数组中的所有主题分类,您可以执行以下操作:

$subject_classifications = $xml->xpath("//SubjectClassification");

xml 变量指的是您的主要 simplexml 对象,即您使用 simplexml 加载的文件。

然后你可以使用这样的 foreach 循环遍历数组:

foreach($subject_classifications as $subject_classification){
echo (string) $subject_classification->Authority;
echo (string) $subject_classification->Value;
echo (string) $subject_classification->Id;
}

您的结构可能会有所不同,但无论如何您都会明白。您可以在此处查看 IBM 的一篇好文章“Using Xpath With PHP”

于 2013-06-07T20:06:01.220 回答
1

对于 s 的所有后代(即孩子、孙子、孙子、孙子、孙子-...(你明白了))<subjectClassification>“所有元素 [...] ALL of them!”为您命名它),您可以使用支持此类更高级查询的 Xpath(至少我认为这就是您要查找的内容,您的问题没有给出任何详细的描述,也没有举例说明您所说的“全部”具体是什么意思) .

至于 SimpleXML,您只能使用 Xpath 查询元素(和属性),但由于您只需要元素,这不是显示停止器:

$allOfThem = $subjects->xpath('./SubjectClassification//*');

这里的关键点是 Xpath 表达式:

./SubjectClassification//*

根据.开头的点,它与上下文节点相关,$subjects在您的情况下。然后查找所有下降到名为 的直接子元素的元素SubjectClassification。这适用于//(未指定深度)和*(任何元素,星号充当通配符)。

所以希望这能在几个月后回答你的问题。我只是通过清理一些 XML 问题偶然发现了它,也许这对将来的参考也很有用。

于 2013-10-26T20:01:56.700 回答
0

我已经添加了第二个答案,以防你实际抛出的是检索属性数组而不是节点。这就是您可以打印出主 $xml 对象中每个 SubjectClassification 的属性的方法。

foreach($xml->SubjectClassification->attributes() as $key => $value) {
    echo $key . " : " . $value "\n";
}
于 2013-06-07T20:32:11.733 回答
0

我发现它count返回了正确数量的元素,然后您可以使用标准for循环来迭代它们:

$n = count($subjects->SubjectClassification);
for ($i = 0; $i < $n; $i++) {
    var_dump($subjects->SubjectClassification[$i]);
}

我不确定为什么foreach循环不起作用,也不确定为什么$subjects->SubjectClassification直接转储只显示第一个节点,但对于任何像我一样偶然发现这个古老问题的人来说,以上是在不求助于外部库的情况下查找更多信息的一种方法.

于 2016-06-02T20:09:09.553 回答