【问题标题】:Detecting simpleXml array property检测 simpleXml 数组属性
【发布时间】:2012-10-03 14:14:03
【问题描述】:

我认为我在这里遗漏了一些非常明显的东西,但是有人可以向我解释为什么我得到的是我现在的输出,而不是我在以下 var 转储中所期望的输出:

这是原始 xml:

<result>
    <category>
        <id>3</id>
        <name>Category 1</name>
        <subcategory>
            <id>9</id>
            <name>SubCat 1</name>
        </subcategory>
        <subcategory>
            <id>10</id>
            <name>SubCat 2</name>
        </subcategory>
        <subcategory>
            <id>11</id>
            <name>SubCat 3</name>
        </subcategory>
    </category>
</result>

我在做什么:

$xml = new SimpleXMLElement($file);
foreach($xml->category as $node)
{
    echo "dump 1:
";
    var_dump($node);
    echo "**********************************************
dump 2:
";
    var_dump($node->subcategory);
    die();
}

这个输出:

dump 1:
object(SimpleXMLElement)#130 (3) {
    ["id"]=>
    string(1) "3"
    ["name"]=>
    string(10) "Category 1"
    ["subcategory"]=>
    array(3) {
        [0]=>
        object(SimpleXMLElement)#133 (2) {
            ["id"]=>
            string(1) "9"
            ["name"]=>
            string(8) "SubCat 1"
        }
        [1]=>
        object(SimpleXMLElement)#135 (2) {
            ["id"]=>
            string(2) "10"
            ["name"]=>
            string(8) "SubCat 2"
        }
        [2]=>
        object(SimpleXMLElement)#136 (2) {
            ["id"]=>
            string(2) "11"
            ["name"]=>
            string(8) "SubCat 3"
        }
    }
}
**********************************************
dump 2:
object(SimpleXMLElement)#138 (2) {
    ["id"]=>
    string(1) "9"
    ["name"]=>
    string(8) "SubCat 1"
}

第一个 var 转储输出我所期望的,但我希望第二个 var_dump 的输出是:

array(3) {
    [0]=>
    object(SimpleXMLElement)#133 (2) {
        ["id"]=>
        string(1) "9"
        ["name"]=>
        string(8) "SubCat 1"
    }
    [1]=>
    object(SimpleXMLElement)#135 (2) {
        ["id"]=>
        string(2) "10"
        ["name"]=>
        string(8) "SubCat 2"
    }
    [2]=>
    object(SimpleXMLElement)#136 (2) {
        ["id"]=>
        string(2) "11"
        ["name"]=>
        string(8) "SubCat 3"
    }
}

甚至是一个包含所有数组项的对象。为什么不是这样?

我可以看到,当我调用var_dump($node-&gt;subcategory) 时,它正在转储它找到的第一个“子类别”节点,但为什么它会将所有“子类别”节点转换为第一个 var 转储的数组而不是第二个?我将如何模仿这种行为来检测“子类别”是否包含多个对象(就像在第一个 var 转储中所做的那样)?

基本上我要做的是检测 SimpleXMLElement 的属性是否包含更多值的数组(即它是否包含子节点)

我尝试了各种方法,但似乎无法检测到 simpleXml 对象的某个属性是否包含一组数组。

更新:

我发现这是可行的:

if(count($node->subcategory)>1)
{
    // we have  more than one subcategory
}

但这不是最优雅的方式,我确定一定有更干净的方法?

【问题讨论】:

  • 这篇文章的答案可能会对你有所帮助:stackoverflow.com/questions/2751711/…var_dump($node["subcategoy"]);
  • @feskr 谢谢,我在我的实际代码中通过 foreach 循环推送所有属性(以及属性),它似乎没有区分属性和属性,这是一个问题!
  • @feskr var_dump($node["subcategory"]) 输出:NULL
  • 对不起,我有另一个回答你

标签: php simplexml var-dump


【解决方案1】:

这个属性是迭代器的对象:

$node->subcategory

如果您需要获取所有项目,请尝试:

foreach($xml->category as $node)
{
...
  foreach($node->subcategory as $subcategory)
  {
     $data[] = (array) $subcategory
  }
...
}

如果您需要知道您成功使用计数方法的子类别项目的数量。

如果不改变 XML 树,你可以使用 xpath:

$categories = $xml->xpath('/category/subcategory');
var_dump($categories)

【讨论】:

  • xpath 方法在我的特定场景中不起作用,因为子类别可能是递归的(噩梦!)。不过,$data 方法的适应性很好,谢谢!
【解决方案2】:

调整你的xml文件:

<result>
    <category>
        <id>3</id>
        <name>Category 1</name>
        <subcategories>
          <subcategory>
            <id>9</id>
            <name>SubCat 1</name>
          </subcategory>
          <subcategory>
            <id>10</id>
            <name>SubCat 2</name>
          </subcategory>
          <subcategory>
            <id>11</id>
            <name>SubCat 3</name>
          </subcategory>
        </subcategories>
    </category>
</result>

然后尝试:

var_dump($node->subcategories);

【讨论】:

  • 谢谢,只有这样才行,不幸的是我无法更改 XML 文件!
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多