Разделить XML на группу связанных узлов

#xml

#xml

Вопрос:

Инструменты CLI, такие как csplit, позволяют нам разделять XML-файлы на основе определенного элемента. Я хочу разделить XML-файлы на группу. Например:

 <prices>
  <price>
    <code>A123</code>
    <discount>123</discount>
  </price>
  <price>
    <code>A123</code>
    <discount>123</discount>
  </price>
  <price>
    <code>B456</code>
    <discount>123</discount>
  </price>
</prices>
 

необходимо разделить в один файл с:

 <price>
    <code>A123</code>
    <discount>123</discount>
</price>
<price>
    <code>A123</code>
    <discount>123</discount>
</price>
 

и еще один файл с:

 <price>
    <code>B456</code>
    <discount>123</discount>
</price>
 

Мы можем добиться этого, используя потоковый анализатор XML и сравнивая значение элемента кода с предыдущим и генерируя новые XML-файлы, если они не равны. Однако должен быть более эффективный способ с использованием комбинации инструментов CLI.

Ответ №1:

Вы можете попробовать xsh, оболочку вокруг XML::LibXML:

 open file.xml ;
$h := hash code /prices/price ;
for $code in { keys %$h } {
    $d := create prices ;
    xcp xsh:lookup('h', $code) into $d/prices ;
    save :f concat($code, '.xml') $d ;
}
 

Комментарии:

1. Спасибо за предложение. Я вижу, что последний выпуск был в 2008 году, и он даже не будет компилироваться.

2. Я выпустил его 26 августа этого года. Вы нажали правильную ссылку?