XML 파일에서 태그 제거

XML 파일에서 태그 제거

내 파일에 식별할 수 없는 데이터가 포함되어 있습니다. 다음과 같이 말해보세요:

<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
.
.</Record></ns0:collection>

N개의 파일을 병합하여 하나의 파일을 만들어야 합니다. 그래서 다음을 수행해야 합니다.

  1. </ns0:collection>첫 번째 파일에서 닫는 태그를 제거하면 됩니다 .
  2. 다음 (n-1)개 파일의 <?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">합계 삭제</ns0:collection>
  3. 마지막 파일 만 삭제 <?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">하고 모두 병합해야 합니다.

명령을 사용하여 첫 번째 파일을 처리하려고 시도했지만 sed결과가 나오지 않았습니다. "merged.xml"은 비어 있었습니다.

sed '/<\/ns0:collection>/d' $file1 > merged.xml

어떤 제안이 있으십니까?

답변1

use 만 지정하지 않았 sed으므로 액세스 권한이 있는 경우 xml_grep(참조명령줄에서 여러 XML 파일 병합, 두 번째 답변), 이것은 여러분에게 많은 부담을 주고 다음과 같은 간단한 병합 작업을 단일 명령으로 수행할 수 있기 때문에 이것을 권장합니다.

xml_grep --cond Record --wrap "ns0:collection" --descr 'xmlns:ns0="http://namespace/Service/1.0"' --encoding "UTF-8" *.xml

테스트 파일:

테스트.xml

<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namespace/Service/1.0""><Record>
Test
</Record></ns0:collection>

테스트1.xml

<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namespace/Service/1.0"><Record>
Test 1<a>a</a><b c="c">d</b>
</Record></ns0:collection>

결과

<?xml version="1.0" encoding="UTF-8" ?>
<ns0:collection xmlns:ns0="http://namespace/Service/1.0">
<Record>
Test 1<a>a</a><b c="c">d</b></Record><Record>
Test
</Record>
</ns0:collection>

XML 파일로 작업할 때 구조를 망칠 가능성이 sed매우 높고 잘못된 형식의 XML 문서가 되기 쉽기 때문에 XML 인식 도구를 사용하는 것을 선호합니다!

답변2

sedXML 처리에 적합하지 않은 using을 사용하고 대신 파서를 사용하는 것이 좋습니다 .

또한 여기에 XY 문제가 있다고 제안합니다. 태그를 제거하는 것이 아니라 XML 파일을 병합하는 것입니다.

개인적으로 - 나는 perl다음을 좋아한다 XML::Twig:

#!/usr/bin/env perl
use strict;
use warnings;

#load the parser
use XML::Twig; 

#get our file list - we use the "first" file as the basis.
#can use sort on this list if desired. 
my ( $first_file, @other_files ) = glob ( 'C://tmp//xmltest/*.xml' ); 

#Our 'parent' document. 
my $doc = XML::Twig -> new -> parsefile ( $first_file ); 


foreach my $file ( @other_files ) { 
   my $mergedoc = XML::Twig -> new -> parsefile ( $file ); 

   #//Record means any <Record> node anywhere in the tree. 
   foreach my $record ( $mergedoc -> get_xpath ( '//Record' ) ) {
      $record -> cut;
      #paste it into our parent doc, as the last node. 
      $record -> paste ( after => $doc -> root -> last_child );
   }
}

#set output formatting (optional)
$doc -> set_pretty_print ('indented_a'); 

#print to STDOUT.
$doc -> print;

#write to output file too
open ( my $output, '>', 'combined.xml' ) or die $!;
print {$output} $doc -> sprint;
close ( $output );

이는 의도적으로 대상 XML에서 요소를 추출하여 Record문서 간에 병합합니다. 그러나 이는 xpath매우 강력하고 정규 표현식과 동일한 XML과 같은 유연한 접근 방식이지만 정규 표현식은 그렇지 않은 반면 컨텍스트를 인식하므로 더 좋습니다.

답변3

해결책:

  1. 첫 번째 파일에서 닫는 태그만 제거해야 합니다. 해결 방법:

    sed -i.bak -e 's/<\/ns0:collection>/ /' -e 's/<\/Record>/ /' n0
    
  2. 다음 (n-1) 파일의 합계를 삭제합니다 <?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">.</ns0:collection>

    sed -i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' -e 's/<\/R.*>.*>/ /' n1
    
    • 다양한 파일 이름에 대해 다음을 수행하십시오.

      find . -type f -name "n[1-3]" -exec sed i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' -e 's/<\/R.*>.*>/ /' {} \;
      
  3. 마지막 파일만 제거하고 모두 병합해야 합니다.

    sed i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' ne
    

마지막으로 합류하세요:

cat n0 n[1-3] ne > joined

n0, n1, n2및 . 파일을 사용했습니다 n3. ne각 내용에 다음 텍스트를 추가했습니다.

<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
hello from nigeria
</Record></ns0:collection>

생성된 파일은 joined다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
hello from nigeria



hello from nigeria



hello from nigeria



hello from nigeria



hello from nigeria
</Record></ns0:collection>

노트:

  1. 첫 번째 질문에서 둘 </Record></ns0:collection>모두뿐만 아니라 </ns0:collection>.</Record>

  2. 모든 파일에 대해 하나의 명령을 실행할 수 있도록 여기의 파일 이름을 수정해야 합니다 n[1-3]. 여기서는 가장 적합한 이름을 선택했습니다.

  3. 먼저 테스트를 실행하고 결과를 확인해 보세요., 여기서는 자동으로 백업을 생성하는 데 사용합니다 i.bak.sed

관련 정보