2013-04-22 76 views
2

我有一個包含數百個地標的kml文件,我需要將每個地標移動到它自己的文件夾中。 在這個過程中,我需要能夠通過它的地標名稱來命名/重命名每個文件夾。 這可以通過使用awk,perl或sed來完成嗎?我不是一位XML專家。用KML文件中的文件夾標記包裹地標標記

KML是以下形式:

<Folder> 
    <name>TEST</name> 
    <open>1</open> 
    <Placemark> 
     <name>LOCATION ONE</name> 
     [...] 
    </Placemark> 
    <Placemark> 
     <name>LOCATION TWO</name> 
     [...] 
    </Placemark> 
    <Placemark> 
     <name>LOCATION ONE &amp; TWO</name> 
     [...] 
    </Placemark> 
</Folder> 

,它需要是這樣的:

<Folder> 
     <name>TEST</name> 
     <open>1</open> 
     <Folder> 
     <name>LOCATION ONE</name> 
     <Placemark> 
       <name>LOCATION ONE</name> 
       [...] 
     </Placemark> 
     </Folder> 
     <Folder> 
     <name>LOCATION TWO</name> 
     <Placemark> 
       <name>LOCATION TWO</name> 
       [...] 
     </Placemark> 
     </Folder> 
     <Folder> 
     <name>LOCATION ONE &amp; TWO</name> 
     <Placemark> 
       <name>LOCATION ONE &amp; TWO</name> 
       [...] 
     </Placemark> 
     </Folder> 
</Folder> 

到目前爲止,我設法包裹每<placemark>標籤通過<folder>標籤使用下列AWK命令,但我需要能夠通過它的地標名稱重命名每個文件夾:

awk '/<Placemark>/{system("cat file1");next}1' file.kml 
awk '/<\/Placemark>/{system("cat file2");next}1' file.kml 

文件1:

<Folder> 
<name>@@[email protected]@</name> 
<Placemark> 

文件2

</Placemark> 
</Folder> 

回答

1

這個腳本應該讓你去:

# Expects the file in reverse 
# tac file.xml | awk -f parse_kml.awk | tac 

/<\/Placemark>/ { 
    p_flag = 1   # Set flag if inside tag 
    print "</Folder>" # Print closing folder tag 
    print $0   # Print current line 
    next    # Skip to next line 
} 
/<Placemark>/ { 
    print $0   # Print current line 
    print line   # Print name tag 
    print "<Folder>" # Print folder tag 
    next    # Skip to next line 
} 
p_flag && /<name>/ { 
    line=$0    # Store the line 
} 
{ 
    print $0 
} 

保存到一個文件,如parse_kml.awk和運行線路:

tac file.xml | awk -f parse_kml.awk | tac 

如果你有xmllint你可以使用這種格式輸出:

$ tac file.xml | awk -f parse_kml.awk | tac | xmllint --format - 
<?xml version="1.0"?> 
<Folder> 
    <name>TEST</name> 
    <open>1</open> 
    <Folder> 
    <name>LOCATION ONE</name> 
    <Placemark><name>LOCATION ONE</name> 
     [...] 
    </Placemark> 
    </Folder> 
    <Folder> 
    <name>LOCATION TWO</name> 
    <Placemark><name>LOCATION TWO</name> 
     [...] 
    </Placemark> 
    </Folder> 
    <Folder> 
    <name>LOCATION ONE &amp; TWO</name> 
    <Placemark><name>LOCATION ONE &amp; TWO</name> 
     [...] 
    </Placemark> 
    </Folder> 
</Folder> 
+1

這太棒了!一切工作,沒有別的事情要做。 'tac file.xml | awk -f parse_kml.awk | tac | xmllint --format - > file.kml' – 2013-04-22 13:09:46

+0

@ user2302372太好了! – 2013-04-22 13:13:52