Разделите XML-файл на несколько файлов

Если я понимаю правильно, Вы хотите список каталогов, содержащих подкаталог, содержащий названный файл __openerp__.py, без дубликатов.

В zsh:

print -rl -- **/__openerp__.py(:h:h) | sort -u

или

a=(**/__openerp__.py(:h:h)); print -rl -- ${(u)a}
2
25.10.2014, 19:40
3 ответа

Я думаю, что следующие должны помочь. Это обычная задача, которая должна сделать между двумя пределами.

unset f t
while read l
do
  t=${t:+$t\\n}$l
  l=${l//[<>]/}
  : ${f:="$l"}
  if [ "$l" = "/$f" ]
  then
    echo -e "$t" > "$f".xml 
    unset f t
  fi
done < <(cat your_xml_file)
0
27.01.2020, 22:05

XML-среза из XML-COREUTILS может выполнить ваши потребности

0
27.01.2020, 22:05

Во-первых - я скажу, что думаю, что это довольно плохая идея делать парсинг XML с чем-либо, кроме парсера XML. Регулярные выражения могут выглядеть как будто они будут работать, но это действительно хороший способ сделать некоторый хрупкий код - XML, который семантически эквивалентен, может выглядеть по-другому с разными RE (такими как отступы/линии и одинарные теги).

Так что, имея это в виду - я бы использовал Perl и библиотеку XML::Twig. Это довольно стандартная вещь - пребилдированные пакеты доступны повсеместно.

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

<root>
<unix>
 <mm />
</unix>
<osx>
 <nn />
</osx>
</root>

И использование этого кода сделает то, о чем вы просите:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->parsefile("your_xml.xml");

foreach my $element ( $twig->root->children ) {
    my $tag = $element->tag;
    print "Processing $tag\n";

    #print to STDOUT for debugging
    print $element ->sprint;

    #print to output file
    open( my $output, ">", "$tag.xml" ) or warn $!;
    print {$output} $element->sprint;
    close($output);
}

Если, конечно, ваше сообщение XML является буквально тем, что у вас есть, то это сломанный XML, и в идеале вы должны пойти и ударить того, кто дал вам его, свернутой копией документа спецификации. Если это непрактично, так как это реальная жизнь, то я бы предложил вам этот ответ на Stack Overflow: https://stackoverflow.com/a/28913945/2566198

3
27.01.2020, 22:05

Теги

Похожие вопросы