XML 파일을 여러 파일로 분할

XML 파일을 여러 파일로 분할

다른 노드가 포함된 xml 파일이 있는데 다음과 같이 파일을 분할하고 싶습니다.

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

unix.xml스크립트를 실행할 때 다음 내용으로 호출되는 xml 파일을 생성하고 싶습니다.

<unix
 <mm>
</unix>

osx.xml그런 다음 다음 내용으로 호출되는 또 다른 xml 파일이 있습니다.

<osx>
 <nn>
</osx>

답변1

우선, 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

답변2

나는 다음이 도움이 될 것이라고 생각합니다. 이는 일반적인 작업이며 두 제한 사이에서 수행되어야 합니다.

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)

답변3

XML 컷~에서xml-coreutils귀하의 요구를 충족시킬 수 있습니다

관련 정보