如何短语/分解 XML 数据?

问题描述

我正在尝试从 xml 文件创建打印机墨水店。

在 XML 中有 ID、名称、类别和描述。在Toner pasuje do drukarek: 之后和Pokrewne kody: 之前的描述中,列出了适合墨水的打印机型号(每个打印机名称都以制造商名称开头(例如佳能,惠普,兄弟))。我想对这些打印机进行措辞,并一次列出一台。

<offers>
   <offer>
      <id>37</id>
      <name>
      Toner zamiennik 12a do hp (q2612a) (czarny) - darmowa dostawa w 24h
      </name>
      <description>
      Toner Zamiennik 12A do HP (Q2612A) (Czarny) Toner pasuje do drukarek:HP LaserJet 1010HP LaserJet 1022 NHP LaserJet 3052HP LaserJet 1012HP LaserJet 1022 NWHP LaserJet 3055HP LaserJet 1015HP LaserJet 3015HP LaserJet M1005 MFPHP LaserJet 1018HP LaserJet 3020HP LaserJet M1300 MFPHP LaserJet 1020HP LaserJet 3030HP LaserJet M1319 F MFPHP LaserJet 1020 PlusHP LaserJet 3050HP LaserJet 1022HP LaserJet 3050 ZPokrewne kody: Toner,Tonery,Q2612A,12A,DT-TH-12A,DrTusz,Hewlett Packard,HP Kod EAN: 5902811000000
      </description>
      <shopcategory>Wkłady -> Laserowe -> Zamienniki -> Tonery</shopcategory>
  </offer>
  <offer>
      <id>38</id>
      <name>
      Toner zamiennik 06a do Canon (c3906a) (czarny) - darmowa dostawa w 24h
      </name>
      <description>
      Toner Zamiennik 06A do Canon (C3906A) (Czarny) Toner pasuje do drukarek:Canon LaserJet 3100Canon LaserJet 3150 XICanon LaserJet 6 L ProCanon LaserJet 3100 SECanon LaserJet 5 LCanon LaserJet 6 L SECanon LaserJet 3100 XICanon LaserJet 5 L XtraCanon LaserJet 6 L XICanon LaserJet 3150Canon LaserJet 5 LFSCanon LaserJet 3150 SECanon LaserJet 6 LPokrewne kody: Toner,C3906A,06A,DT-TH-06A,Canon Kod EAN: 5902811000086          </description>
      <shopcategory>Wkłady -> Laserowe -> Zamienniki -> Tonery</shopcategory>
</offer>
</offers>

示例

说明是

<description>
      Toner Zamiennik 12A do HP (Q2612A) (Czarny) Toner pasuje do drukarek:HP LaserJet 1010HP LaserJet 1022 NHP LaserJet 3052HP LaserJet 1012Pokrewne kody: Toner,HP Kod EAN: 5902811000000
      </description>

我想要改变

HP LaserJet 1010HP LaserJet 1022 NHP LaserJet 3052HP LaserJet 1012

<printer>HP LaserJet 1010</printer>
<printer>HP LaserJet 1022 N</printer>
<printer>HP LaserJet 3052</printer>
<printer>HP LaserJet 1012</printer>

我该怎么做(例如在 PHP 中)?

谢谢

解决方法

您可以通过以下步骤解析描述:

算法

  • 找到 "Toner pasuje do drukarek:""Pokrewne kody" 之间的子串
  • 查找子字符串中的第一个单词以获得brand
  • brand分割子串
  • 删除第一个元素(它将为空)
  • 将品牌置于每个拆分元素之前

代码

$start = 'Toner pasuje do drukarek:';
$end = 'Pokrewne kody';

$descriptions = [...];

$printers = [];
foreach ($descriptions as $description) {
    $startIndex = strpos($description,$start) + strlen($start);
    $endIndex = strpos($description,$end);
    $length = $endIndex - $startIndex;
    $printersAsText = substr($description,$startIndex,$length);
    $firstWord = explode(' ',$printersAsText)[0];
    $printer = explode($firstWord,$printersAsText);
    array_shift($printer);

    $printers[] = array_map(function ($e) use ($firstWord) { return $firstWord . $e; },$printer);
}

print_r($printers);

工作example