将xml节点的拆分元素作为json返回

时间:2011-11-06 18:11:47

标签: php xml json

我坚持使用xml,其中一个节点将所有信息整合在一起,我需要将它们分成3个独立的对象。现在它是描述 - 颜色,大小。所以我知道我可以使用-,字符进行拆分,然后以这种方式处理它们。我能够分开描述[0],但现在我很困惑如何抓住那个分裂的[1]和[2]部分。 -之后的部分,然后是,

的另一部分

我正在用这样的东西将xml转换成json:

xml:

<Groups>
 <Group>
   <Item>
     <Description>One Item - Color: Black, Size: 9</Description>
   </Item>
  </Group>
  <Group>
    <Item>
      <Description>Two Item - Color: White, Size: 11</Description>
    </Item>
  </Group>
</Groups>

php:

  $xml = simplexml_load_string($response);
  $items = count($xml->Groups->Group->Item);
  for ($i=0;$i<$items;$i++)
{
        if ($i) {
        $descriptions = $descriptions . '<br>' ;}
        $descriptions = $descriptions  .  $xml->Groups->Group->Item[$i]->Description[0];
        $descriptions = preg_split("/-/", $descriptions);
        $descriptions = $descriptions[0];

    }

$json = '{'. '"Description": "'.$descriptions.'",'.'}'; 

然后如果var itemDesc = json.Description;

该变量将返回:

One Item <br> Two Item <br >

如何从该分割中获取接下来的两个部分。我正在尝试这样的东西:

$color = $descriptions[1];

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您继续拆分/爆炸/解析该代码块内的描述字符串,您可能会使其变得非常复杂。第一个想法是创建一个可以解析字符串并返回一些带有值的数组的函数,但后来我认为这样会更好:

$item = new Item('Two Item - Color: White, Size: 11');

$item->getName(); # Two Item
$item->getProps(); # array( Color => White, Size => 11)

然后,只要适合您,您就可以使用此对象。解析是这样完成的:

  1. 分为-之前和之后的部分。
  2. 解析属性的第二部分:名称+值。
  3. 如果有任何失败,请抛出异常。
  4. 以下代码执行此操作,检查非常严格,我认为这样做很好,因此您很早就会在规范中发现错误:

    private function initFromText($description)
    {
        list($this->name, $propText) = explode(' - ', $description, 2) + array('','');
    
        $propToken = '([a-z]+): (.*?)(, |$)';
        $offset = 0;
    
        while($r = preg_match("~$propToken~i", $propText, $matches, PREG_OFFSET_CAPTURE, $offset))
        {
            list($full, $name, $value) = $matches;
            if ($full[1] !== $offset || isset($this->props[$name[0]]))
                throw new InvalidArgumentException(sprintf('Invalid Description given ("%s").', $description));
            $this->props[$name[0]] = $value[0];
            $offset += strlen($full[0]);
        }
        // all consumed?
        if (strlen($propText) !== $offset)
            throw new InvalidArgumentException(sprintf('Invalid Description given ("%s").', $description));
    }
    

    然后我注意到你也可以简化你的迭代,看看下面的内容,它会给你一个想法:

    $xml = simplexml_load_string($response);
    foreach($xml->xpath('Group/Item') as $i => $item)
    {
        $description = (string) $item->Description;
        printf("%d: %s\n", $i, $description);
        $item = new Item($description);
        var_dump($item->getName(), $item->getProps());
    }
    

    Full Example Code