Meine Eingabe XML ist unten. Ich muss in meiner XML-Eingabe suchen, wenn das Schlüsselwort "SEARCH" vorhanden ist. Wenn vorhanden, muss ich den Inhalt von <record>
zu </record>
kopieren und in eine andere XML-Datei schreiben.awk: Suche nach einem Schlüsselwort in XML und schreibe in eine andere Datei
XML-Input-
<XML>
<record category="xyz">
<person ssn="" e-i="E">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>SEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
<record category="abc">
<person ssn="" e-i="F">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>DONTSEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is not present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
</XML>
Mein jetziger Code:
NR==FNR {
keywordArray[NR]=$0;
next;
}
/<record/{ i=1 }
i { a[i++]=$0 }
/<\/record>/ {
if (found) {
for (i=1; i<=length(a); ++i) print a[i] >> output.xml
}
i=0;
found=0
}
$0 ~ "<keyword>"SEARCH"</keyword>" { found=1 }
Ausgabe mit aktuellem Code:
Der Code nicht für "SEARCH", und es ist auf der Suche schreibt nichts in output.xml
Erwartete Ausgabe:
<record category="xyz">
<person ssn="" e-i="E">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>SEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
Auf Tipp: Manipulieren Sie keine XML-Daten mit zeilenorientierten Werkzeugen wie 'awk'. Verwenden Sie stattdessen XML-fähige Tools wie 'xsltproc' und' xmlstarlet'. –
dh xmlstarlet sel -t -m 'XML/Datensatz/Person/Details/Schlüsselwörter/Schlüsselwort [. = "SEARCH"]' -c '../../../ ..' foo.xml> bar.xml – tomc
@tomc: Warum ist ''../../../ ..'' im obigen Code erforderlich? – user2488578