【问题标题】:XML Attributes to arrays (PHP)数组的 XML 属性 (PHP)
【发布时间】:2016-11-23 15:05:10
【问题描述】:

我有一个 XML,其中包含数千个节点,其中包含有关它们的属性信息。 每个节点都是这样的:

<Class Option1="fiahfs;if" Option2="fiowfr0r0" ClassID="1">
<Class Option1="ro;ewaj;frwajro" Option2="afj;wh;fha" Option3="34014upkla" ClassID="2">
....

我需要将该信息解析为 PHP 数组,其中数组名是属性名,数组中的元素数等于 ClassID 属性。 问题是某些节点具有我没有的其他节点的属性。我之前将 ->attributes() 用于一个选定元素作为

$a => $b, $$a=array();

然后

${$a}[(integer)$products['ClassID']]=$b

其中 $products 是使用 xpath 解析 XML 得到的 simplexml 元素。这基本上给了我我需要的东西——我有几个数组,我可以解决我的请求,比如 $Option1[1] 、 $Option2[1]、Option1[2]...等。

但问题是,如果我只使用一个选定元素的属性列表创建该结构 - 会有一个元素没有的元素,但其他元素有,然后创建数组然后解析 XML - 那里' 不会是一些数组。就像我从该示例的 [0] 创建数组一样,这将给我 $Option1、$Option2,但没有 $Option3。

当我将代码重建为:

foreach ($XML->xpath('/idspace/Class') as $products){
foreach($products->attributes() as $a => $b){
if(!isset($$a) $$a=array();
${$a}[(integer)$products['ClassID']]=$b;
}}

然后我尝试 foreach($ClassID) - 我在该数组中只有一个元素。 如何在使用属性“ClassID”作为数组中的元素编号时将每个 XML 属性解析为数组?

【问题讨论】:

  • $XmlElement-&gt;children();
  • ${$a}[(integer)$products['ClassID']][] = $b?

标签: php arrays xml xpath


【解决方案1】:

我对你的数组很困惑。对我来说,每个属性都有一个额外的数组听起来很奇怪。为什么不创建一个包含每个元素并将属性作为子元素的数组。所以最后你会得到一个这样的数组:

$products = array(
   [1] => array(
       [Option1] => "fiahfs;if",
       [Option2] => "fiowfr0r0",
   ),
   [2] => array(
       [Option1] => "ro;ewaj;frwajro",
       [Option2] => "afj;wh;fha",
       [Option3] => "34014upkla",
   ),

通过这种方式,您可以轻松访问给定 ChildId 的所有属性: $products[$childId]['Option1'] - 或者更好地检查 Attribute-Name 是否存在。

你可以使用 simplexml->attributes()

$products = array();  // products will have the result!
foreach ($xml->products as $productXml) {   // don't know your xml structure here, 
                                            // but you need to iterate over every product in the xml
    $singleProduct = array();
    $classId = 0;
    foreach($productXml->attributes() as $a => $b) {
        if ($a == 'ClassID') {
            $classId = $b;
        } else {
            $singleProduct[$a] = $b;
        }
    }
    $products[$classId] = $singleProduct;
}

【讨论】:

  • 是的,我知道它的结构很奇怪。我只是不想在整个现有项目中使用该地址更改数千个字符串。无论如何,谢谢。可能不正确使用该方法并手动更改地址。
  • 如果您需要结构,则必须遍历所有产品一次 -> 以找出所有现有属性。然后创建数组。然后再次遍历所有产品并用每个产品(ClassID)的数据填充所有属性数组。您需要弄清楚,对于该产品的不存在的属性值,您可以将什么作为空值。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2014-10-20
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2010-11-12
相关资源
最近更新 更多