2011-11-06 2 views
1

노드 중 하나가 모든 정보를 함께 모으는 xml이 붙어있어서 3 개의 개별 객체로 분할해야합니다. 이제 Description - Color, Size입니다. 그래서 나는 -, 문자를 분리하여 그런 식으로 처리 할 수 ​​있다는 것을 알고 있습니다. 설명 [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.'",'.'}'; 
을 다음 -,

에 대한 또 다른 분할 나는 이런 식으로 JSON으로 XML을 변환하고 이후 부분

그리고 나서 var itemDesc = json.Description;

그 변수는 반환합니다

One Item <br> Two Item <br >

그때 얻을 수있는 방법은 다음 두 부분으로 스플릿에서. 나는 다음과 같은 것을 시도했다 :

$color = $descriptions[1]; 

어떤 도움을 주셔서 감사합니다!

+0

: 다음을 참조뿐만 아니라 당신의 반복을 단순화, 그것은 당신에게 아이디어를 줄 것이다 수동으로 XML 또는 JSON을 토큰으로 사용하거나 적절한 XML 파서 인 JSON 작성기를 생성하지 마십시오. 그렇지 않으면 인코딩이 누락 될 수 있습니다 (일부 콘텐츠의 경우 갑자기 실패합니다). PHP에서 모두 처리 할 수있는 libs가 많이 있습니다. 저수준에서 사용하고 변환 논리를 구현하십시오. – StaxMan

+1

주석 주셔서 감사합니다. 혹시 좀 더 읽을 거리를 제공해 줄 수 있습니까? 나는 정말로 당신이 나에게 말하려고하는 것을 이해하지 못합니다. – Zac

+0

코드를 다시 읽었으므로 simple-xml 파서를 제대로 사용하고 있습니다 (정규 표현식을 잘못 사용 했음). 하지만 JSON 작성기/생성기 패키지를 사용하여 출력 형식을 지정하는 것이 좋습니다. JSON 배열 (String 대신 쉼표로 구분 된 값)을 사용할 수 있으므로 클라이언트가 더 쉽게 사용할 수 있습니다. 또한 큰 따옴표 및 줄 바꿈 같은 문자가 JSON String에서 이스케이프되도록합니다. 그렇지 않은 경우 결과는 잘못된 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. 속성의 두 번째 부분 인 Name + Value를 구문 분석하십시오.
  3. 아무것도 실패하면 예외를 throw합니다.
  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