2

我有一个包含数百个地标的 kml 文件,我需要将每个地标移动到它自己的文件夹中。在这个过程中,我需要能够通过地标名称来命名/重命名每个文件夹。这可以通过使用 awk、perl 或 sed 来完成吗?我不是 XML 专家。

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>

到目前为止,我设法使用以下 awk 命令<placemark>逐个<folder>标签包装每个标签,但我还需要能够通过其地标名称重命名每个文件夹:

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

文件1:

<Folder>
<name>@@FOLDER@@</name>
<Placemark>

文件2

</Placemark>
</Folder>
4

1 回答 1

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>
于 2013-04-22T09:21:40.737 回答