#php #xml #json
#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. Пожалуйста, НЕ пытайтесь вручную маркировать XML или JSON или генерировать — используйте надлежащий анализатор XML, JSON writer; в противном случае вы получите недостающую кодировку (для некоторого содержимого внезапно произойдет сбой). Существует множество библиотек для обработки обоих на PHP, просто используйте их на низком уровне, реализуйте логику преобразования
2. Спасибо за комментарий. Можете ли вы предоставить некоторые дополнительные сведения? Я действительно не понимаю, что вы пытаетесь мне сказать.
3. Я перечитал код, так что вы правильно используете синтаксический анализатор simple-xml, так что это хорошо (я ошибочно принял это за использование регулярных выражений). Но я думаю, вам следует рассмотреть возможность использования пакета JSON writer / generator для форматирования выходных данных: это позволит вам использовать массивы JSON (вместо строки со значениями, разделенными запятыми), что упростит работу клиента. Это также гарантирует, что символы, такие как двойные кавычки и переводы строк, являются escape в строке JSON: если это не так, результатом будет недопустимый JSON.
Ответ №1:
Если вы продолжите разделять / взрывать / анализировать строку описания внутри этого блока кода, вы, вероятно, сильно усложните ее. Первой идеей было создать функцию, которая может анализировать строку и возвращает некоторый массив со значениями, но потом я подумал, что это было бы намного приятнее:
$item = new Item('Two Item - Color: White, Size: 11');
$item->getName(); # Two Item
$item->getProps(); # array( Color => White, Size => 11)
Затем вы можете использовать этот объект, когда вам это удобно. Синтаксический анализ выполняется следующим образом:
- Разделить на части до
-
и после. - Проанализируйте вторую часть для свойств: Имя значение.
- Если что-то не удается, создайте исключение.
Следующий код делает это, проверка довольно строгая, с которой, я думаю, неплохо начать, чтобы вы могли найти ошибки в своей спецификации на ранней стадии:
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: %sn", $i, $description);
$item = new Item($description);
var_dump($item->getName(), $item->getProps());
}