2011-11-06 35 views
1

我被xml卡住,其中一個節點將所有信息聚集在一起,我需要將它們拆分爲3個獨立的對象。現在它是描述 - 顏色,大小。所以我知道我可以使用-,字符進行分割,然後以這種方式處理它們。我能夠分解描述[0],但現在我很困惑如何抓住分割的[1]和[2]部分。作爲json返回的xml節點的拆分元素

的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.'",'.'}'; 
-,然後又拆分爲 ,

我將XML轉換成JSON像這樣的東西之後的部分

然後如果var itemDesc = json.Description;

該變量將返回:

One Item <br> Two Item <br >

接下來的兩個部分我怎麼能那麼從那個分裂。我正在嘗試像這樣的東西:

$color = $descriptions[1]; 

感謝您的任何幫助!

+0

請不要嘗試手動標記XML或JSON,或者生成 - 使用正確的XML解析器,JSON編寫器;否則你最終會丟失編碼(某些內容突然失效)。有很多庫用於處理PHP,只需使用低級別的庫,實現轉換邏輯 – StaxMan

+1

感謝您的評論。你能否提供一些進一步的閱讀?我真的不明白你想告訴我什麼。 – Zac

+0

我重新讀取代碼,所以你正確使用simple-xml解析器,所以這很好(我誤以爲它使用正則表達式)。但是我認爲你應該考慮的是使用JSON編寫器/生成器包來格式化輸出:這將允許您使用JSON數組(而不是使用逗號分隔值的String),這使得客戶端更容易。它還將確保字符如雙引號和換行符在JSON字符串中轉義:如果它們不是,則結果是無效的JSON。 – StaxMan

回答

0

如果您繼續拆分/分解/解析該代碼塊中的描述字符串,您可能會使其變得非常複雜。第一個想法是創建可以解析字符串,並返回一些數組值的函數,但我認爲這將是更美好:

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

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

,只要它適合你,你可以使用這個對象。解析是這樣完成的:

  1. 分成-之前和之後的部分。
  2. 解析第二部分的屬性:名稱+值。
  3. 如果有任何失敗,則拋出異常。

下面的代碼這樣做,檢查是非常嚴格的,我認爲這是一個好的開始,所以你在你的規範早期發現錯誤:

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