2017-11-27 7 views
1

Nach Update .properties file with values from .xml file Ich habe folgende Probleme:aktualisieren .properties-Datei mit den Werten aus XML-Datei - Probleme

Problem 1: Beispiel: X.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE DOC SYSTEM "ts.dtd"> 
<?xml-stylesheet type="text/css" href="ts.css"?> 
<DOC> 
    <PTXT ID="a.b.c.d" CONTEXT="label"><NTI>Text</NTI></PTXT> 
</DOC> 

Y.properties:

a.b.c.d=Text 

und meine Ausgabe lautet:

a.b.c.d= 
    Text= 
= 

Können Sie mir bitte helfen, da ich wirklich nicht verstehe, was vor sich geht.

Problem 2: Beispiel: X.xml

my.id = \u00D6ffnen Express WebTools 

und Y.properties

<PTXT ID="my.id" CONTEXT="">Öffnen <NTI>Express WebTools</NTI></PTXT> 

ergibt: out.properties

my.id=Öffnen Express WebTools 
my.id=\u00D6ffnen Express WebTools 

anstelle von

aktualisiert

  • All meine Dateien enthalten verschachtelten NTI, keine NTI und Text mit verschachtelten NTI kombiniert.
  • ich nicht Zeichenfolge beitreten kann, die mit = enden wie janos vorgeschlagen, weil meine Ausgabe wie etwas ist:

    first.id = second.id = Text aus dem zweiten ID Text aus dem ersten id = ich nicht wissen, was mit Stackoverflow falsch ist, aber es scheint, dass es meinen Code ist als Code nicht sehen ....

+0

Fügen Sie Ihre xmlstarlet-Befehle zu Ihrer Frage hinzu. – Cyrus

+0

Mein xmlstarlet-Befehl ist die Antwort aus der verknüpften Frage. – Robert

Antwort

0

Ihr Beispiel XML-Datei gegeben, und dieser Befehl:

xmlstarlet fo --dropdtd "$file" | xmlstarlet sel -t -m "/DOC/PTXT" -v $'concat(@ID, "=", ., "\n")' 

ich diese Ausgabe:

a.b.c.d= 
    Text 

Im concat des xmlstarlet, wenn ich die .-./NTI ändern, ich habe die Ausgabe erhalten:

a.b.c.d=Text 

So sehe ich zwei Möglichkeiten für Sie. Wenn einige Ihrer Eingabedateien enthalten die NTI und andere Eingabedateien nicht, und es gibt keine Eingabedateien mit einer Mischung aus NTI anwesend und abwesend, dann könnte man eine bedingte hinzufügen zu erkennen, ob die Datei die enthält verschachtelt NTI oder nicht, und verwenden Sie unterschiedliche xmlstarlet Befehl entsprechend. Zum Beispiel:

if xmlstarlet fo --dropdtd "$file" | xmlstarlet el | grep -q DOC/PTXT/NTI; then 
    cmd=$'concat(@ID, "=", ./NTI, "\n")' 
else 
    cmd=$'concat(@ID, "=", ., "\n")' 
fi 

xmlstarlet fo --dropdtd "$file" | xmlstarlet sel -t -m "/DOC/PTXT" -v "$cmd" 

Wenn eine einzelne XML-Datei beiden Strukturen enthält, verschachtelten NTI und keine verschachtelten NTI, dann ist eine weitere Option $'concat(@ID, "=", ., "\n")', zu verwenden, aber die Ausgabe verarbeitet, Verbindungslinien, die mit = Ende mit der nächsten Zeile.

Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen.

+0

Leider enthalten alle meine Dateien verschachtelte NTI, keine NTI und Text + NTI. – Robert

+0

Das ist die Sache. Alle meine Dateien enthalten verschachtelte NTI auf einigen PTXT, einige PTXT haben keine NTI und einige PTXT haben gemischten Text + verschachtelte NTI – Robert

Verwandte Themen