%20XML%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 여러 개의 대용량(>2GB) XML 파일을 작업하고 있는데 그 크기로 인해 문제가 발생하고 있습니다.
(내 응용 프로그램은 PHP 스크립트에서 XMLReader를 사용하여 ~500mb의 작은 파일을 구문 분석하는데 이는 훌륭하게 작동하지만 XMLReader는 이러한 큰 파일을 열지 않습니다.)
그래서 제 생각은 필요하지 않은 파일의 큰 상위 노드를 제거하는 것입니다.
예를 들어, 파일이 다음과 같이 구성되어 있는 경우:
<record id="1">
<a>
<detail>blah</detail>
....
<detail>blah</detail>
</a>
<b>
<detail>blah</detail>
....
<detail>blah</detail>
</b>
<c>
<detail>blah</detail>
....
<detail>blah</detail>
</c>
</record>
...
<record id="999999">
<a>
<detail>blah</detail>
....
<detail>blah</detail>
</a>
<b>
<detail>blah</detail>
....
<detail>blah</detail>
</b>
<c>
<detail>blah</detail>
....
<detail>blah</detail>
</c>
</record>
<a>
내 목적을 위해서는 상위 노드의 데이터만 필요합니다.각 레코드. 부모 노드를 제거할 수 <b>
있고<c>
각 레코드에서, 작업하기에 충분히 작도록 파일 크기를 크게 줄일 수 있습니다.
이와 같은 작업을 수행하는 가장 좋은 방법은 무엇입니까?
sed
나는 대부분의 "XML 인식" 유틸리티를 이러한 대용량 파일에 대해 시도했으므로 이 작업을 수행하기 위해 또는 이와 유사한 것을 사용할 수 있기를 바랍니다 grep
.
답변1
awk를 사용할 수 있습니다.
$cat my.xml | awk '/<b>/{hide=1} /<\/record>/ {hide=0} {if (hide==0) print;}' >mynew.xml
이렇게 하면 포함 라인 이후의 모든 내용이 숨겨지고 <b>
포함 라인부터 시작하여 표시됩니다.</record>
귀하의 의견에 따르면 XML이 하나의 큰 줄인 경우 여러 줄로 나누고 변환을 마친 후 개행을 제거하십시오.
$cat my.xml|sed 's/>/>\n/g'| awk ....... | tr -d '\n' >.....
XML을 버리고 YAML 또는 JSON을 사용해 보세요!
답변2
개인적으로 저는 C(어셈블리 전 가장 낮은 수준)에서 작업을 수행하고 libxml을 사용하여 모든 노드를 반복합니다.
여기 몇 가지 예가 있어요.http://www.xmlsoft.org/examples/
GCC를 사용하여 코드를 컴파일합니다.