nagus
Goto Top

Einzeilige XML per batch umformatieren

Moin zusammen,
ich habe ein Problem bei dem ich nicht weiter komme.

Ich habe XML Dateien, die einzeilig sind und wenn ich sie mit notepad++ umformatiere 329 Zeilen hätten. Mit denen könnte ich was anfangen, weil ich weiß wie ich die per Batch verarbeiten kann, bei einzeiligen bekomme ich das aber so hin.

so sieht die Datei aus:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE cXML SYSTEM "http://www.scheissprojekt.de/"><cXML payloadID="SAPQ01.00000000000000000" timestamp=.... 

so hätte ich sie gerne
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE cXML SYSTEM "http://www.scheissprojekt.de/">  
<cXML payloadID="SAPQ01.00000000000000000" timestamp="2018-01-01T00:00:00+01:00" version="1.2.042" signatureVersion="1.0">  
<Header>
<From>
<Credential domain="NetworkID">  
<Identity>XXXX</Identity>
</Credential>
</From>
<To>
<Credential domain="NetworkID">  
<Identity>XXXX</Identity>
</Credential>
</To>
<Sender>
<Credential domain="NetworkID">  
<Identity>XXXX-T</Identity>
<SharedSecret>
</SharedSecret>
</Credential>
<UserAgent>Supplier</UserAgent>
</Sender>
</Header>
...

Da hier mehr als 600 xml Dateien zu verarbeiten sind, kann ich die nicht mit notepad umformatieren.

Letztendlich brauche ich nur die Information die in Zeile 76 (hier Zeile 4) stehen würde, nämlich BlaBlaBla bzw. den Ausdruck zwischen
<Name xml:lang="de">BlaBlaBla</Name>
und davon nur die ersten 10 Zeichen. BlaBlaBla ändert sich natürlich immer ...

</InvoicePartner>
<InvoicePartner>
<Contact role="from"> 
<Name xml:lang="de">BlaBlaBla</Name> 

Das ganze ist ein temporärer Workaround für ca. 2 Monate.

Wer kann mir weiter helfen?

Danke
Nagus

Content-ID: 482563

Url: https://administrator.de/contentid/482563

Ausgedruckt am: 05.11.2024 um 04:11 Uhr

wiesi200
wiesi200 07.08.2019 um 20:07:33 Uhr
Goto Top
Hallo,

sorry. Auch wen du das nicht hören willst. Dazu lernen und in der Neuzeit ankommen.
XML ist dafür da das mich Zeilennummern nicht interessieren. Dafür gibt's die Knotenbeschreibung.

Mal ein Ansatzpunkt, hättest du aber auch selber suchen können.
BATCH Element aus XML-File auslesen
Pjordorf
Pjordorf 07.08.2019 um 20:51:21 Uhr
Goto Top
Hallo,

Zitat von @Nagus:
Ich habe XML Dateien, die einzeilig sind
Sind die eben nicht, nur dein Anzeige Prg. schreibt dir die ohne Umbrechung so aufm Bildschirm. Je nach mit welchem Prg. du dir Text (XML) Dateien anschaust kannst du unterschiedliche Darstellungen bekommen. Windows braucht aber immer ein 0D0A(Hex) in der Datei damit es Wagenrücklauf und ein Zeilenvorschun dargestellt werden kann. Das was man Sieht ist immer nur ein Teil der Daten Schau mal mit einen Hexeditor dir die Daten an. Linux konnte schon immer ohne 0D0A(Hex) auskommen und dir es ordentlich darstellen. Deswegen kann mein Texteditor auch 2+2=5 Rechnen face-smile

und wenn ich sie mit notepad++
Wähle dort die richtige Einstellung und alles wird gut.

Kommen die Daten aus einem Linux System?

Gruß,
Peter
Nagus
Nagus 08.08.2019 um 09:49:10 Uhr
Goto Top
Moin Wiesi,
ich brauche es als kurzfristigen Workaround und es ist nicht meine Kernaufgabe ...
Den Ansatzpunkt habe ich auch gefunden, allerdings habe ich es bisher noch nicht geschafft den String zu extrahieren.
nagus
Nagus
Nagus 08.08.2019 um 09:50:55 Uhr
Goto Top
Moin Pjordorf,
ich habe kein Problem mir die XML anzusehen oder per Notepad umzuformatieren.
Das scheitert dann nur an der Masse der Dateien. Ich müsste dass bei 600 machen, nächsten Monat bei 1200 ... das ist dann nicht praktikabel ...
nagus
Nagus
Nagus 08.08.2019 aktualisiert um 10:19:26 Uhr
Goto Top
Mit findstr
for /f "tokens=1,2* delims=<" %%i in ('findstr "</InvoicePartner>" datei.xml') do xxx  
finde ich im 2ten Token den Sting </InvoicePartner>. Jetzt müsste ich ab dieser Stelle suchen um dann BlaBlaBla zu finden

</InvoicePartner><InvoicePartner><Contact role="from"><Name xml:lang="de">BlaBlaBla</Name> 
genau daran scheitere ich ...

Ansonsten bräuchte ich ja nur 76 Tokens um den Wert zu bekommen -.-
140447
140447 08.08.2019 aktualisiert um 10:26:57 Uhr
Goto Top
Zitat von @Nagus:
, allerdings habe ich es bisher noch nicht geschafft den String zu extrahieren.
Poste mal die ersten Zeilen bis zum gewünschten Knoten unverändert (Inhalt kannst du natürlich schwärzen, aber die Struktur der Knoten muss erhalten bleiben)dann machen wir dir das schnell. Die ersten Zeilen sind nötig damit man per XPath den Pfad genau definieren kann.
Mit Batch die XML umformatieren ist absoluter Blödsinn, sorry. XML handelt man immer über einen Parser und mit der Powershell ist dass schnell ein Einzeiler auch innerhalb der Batch und das arbeitet dann auch zuverlässig.
Nagus
Nagus 08.08.2019 um 12:16:45 Uhr
Goto Top
hi routerboard,
ich hänge nicht an batch, bei PS fehlt mir aber noch die Tiefe ...

Das ist die erste Zeile der XML bis zu dem Wert den ich benötige. Der Rest interessiert mich nicht.

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.042/InvoiceDetail.dtd"><cXML payloadID="SAPQ01.0000000005207393" timestamp="xxxx" version="1.2.042" signatureVersion="1.0"><Header><From><Credential domain="NetworkID"><Identity>xxxxx</Identity></Credential></From><To><Credential domain="NetworkID"><Identity>xxxxx</Identity></Credential></To><Sender><Credential domain="NetworkID"><Identity>xxxxx</Identity><SharedSecret></SharedSecret></Credential><UserAgent>Supplier</UserAgent></Sender></Header><Request Id="cXMLData" deploymentMode="test"><InvoiceDetailRequest><InvoiceDetailRequestHeader invoiceDate="xxxxx" invoiceID="xxxxx" invoiceOrigin="xxxxx" operation="xxxxx" purpose="xxxxx"><InvoiceDetailHeaderIndicator></InvoiceDetailHeaderIndicator><InvoiceDetailLineIndicator isAccountingInLine="yes" isShippingInLine="yes" isTaxInLine="yes"></InvoiceDetailLineIndicator><InvoicePartner><Contact role="xxxxx"><Name xml:lang="de">xxxxx</Name><PostalAddress><Street>xxxxx</Street><Street>xxxxx</Street><City>xxxxx</City><PostalCode>xxxxx</PostalCode><Country isoCountryCode="DE">xxxxx</Country></PostalAddress></Contact></InvoicePartner><InvoicePartner><Contact role="billTo"><Name xml:lang="de">xxxxx</Name><PostalAddress name="xxxxx"><Street>xxxxx</Street><City>xxxxx</City><PostalCode>xxxxx</PostalCode><Country isoCountryCode="DE">xxxxx</Country></PostalAddress><Phone><TelephoneNumber><CountryCode isoCountryCode="DE"></CountryCode><AreaOrCityCode></AreaOrCityCode><Number></Number></TelephoneNumber></Phone><Fax><TelephoneNumber><CountryCode isoCountryCode="DE"></CountryCode><AreaOrCityCode></AreaOrCityCode><Number></Number></TelephoneNumber></Fax></Contact></InvoicePartner><InvoicePartner><Contact role="from"><Name xml:lang="de">Diesen String benötige ich</Name>
140447
140447 08.08.2019 aktualisiert um 12:35:57 Uhr
Goto Top
Och mönsch bitte in Codetags posten, hast du doch oben auch schon gekonnt! Danke, denn sonst gehen hier Zeichen verloren.
Nagus
Nagus 08.08.2019 um 12:39:06 Uhr
Goto Top
so
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.042/InvoiceDetail.dtd"><cXML payloadID="SAPQ01.0000000005207393" timestamp="xxxx" version="1.2.042" signatureVersion="1.0"><Header><From><Credential domain="NetworkID"><Identity>xxxxx</Identity></Credential></From><To><Credential domain="NetworkID"><Identity>xxxxx</Identity></Credential></To><Sender><Credential domain="NetworkID"><Identity>xxxxx</Identity><SharedSecret></SharedSecret></Credential><UserAgent>Supplier</UserAgent></Sender></Header><Request Id="cXMLData" deploymentMode="test"><InvoiceDetailRequest><InvoiceDetailRequestHeader invoiceDate="xxxxx" invoiceID="xxxxx" invoiceOrigin="xxxxx" operation="xxxxx" purpose="xxxxx"><InvoiceDetailHeaderIndicator></InvoiceDetailHeaderIndicator><InvoiceDetailLineIndicator isAccountingInLine="yes" isShippingInLine="yes" isTaxInLine="yes"></InvoiceDetailLineIndicator><InvoicePartner><Contact role="xxxxx"><Name xml:lang="de">xxxxx</Name><PostalAddress><Street>xxxxx</Street><Street>xxxxx</Street><City>xxxxx</City><PostalCode>xxxxx</PostalCode><Country isoCountryCode="DE">xxxxx</Country></PostalAddress></Contact></InvoicePartner><InvoicePartner><Contact role="billTo"><Name xml:lang="de">xxxxx</Name><PostalAddress name="xxxxx"><Street>xxxxx</Street><City>xxxxx</City><PostalCode>xxxxx</PostalCode><Country isoCountryCode="DE">xxxxx</Country></PostalAddress><Phone><TelephoneNumber><CountryCode isoCountryCode="DE"></CountryCode><AreaOrCityCode></AreaOrCityCode><Number></Number></TelephoneNumber></Phone><Fax><TelephoneNumber><CountryCode isoCountryCode="DE"></CountryCode><AreaOrCityCode></AreaOrCityCode><Number></Number></TelephoneNumber></Fax></Contact></InvoicePartner><InvoicePartner><Contact role="from"><Name xml:lang="de">Diesen String benötige ich</Name>  

oder so:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.042/InvoiceDetail.dtd">  
<cXML payloadID="SAPQ01.0000000005207393" timestamp="xxxx" version="1.2.042" signatureVersion="1.0">  
<Header>
<From>
<Credential domain="NetworkID">  
<Identity>xxxxx</Identity>
</Credential>
</From>
<To>
<Credential domain="NetworkID">  
<Identity>xxxxx</Identity>
</Credential>
</To>
<Sender>
<Credential domain="NetworkID">  
<Identity>xxxxx</Identity>
<SharedSecret>
</SharedSecret>
</Credential>
<UserAgent>Supplier</UserAgent>
</Sender>
</Header>
<Request Id="cXMLData" deploymentMode="test">  
<InvoiceDetailRequest>
<InvoiceDetailRequestHeader invoiceDate="xxxxx" invoiceID="xxxxx" invoiceOrigin="xxxxx" operation="xxxxx" purpose="xxxxx">  
<InvoiceDetailHeaderIndicator>
</InvoiceDetailHeaderIndicator>
<InvoiceDetailLineIndicator isAccountingInLine="yes" isShippingInLine="yes" isTaxInLine="yes">  
</InvoiceDetailLineIndicator>
<InvoicePartner>
<Contact role="xxxxx">  
<Name xml:lang="de">xxxxx</Name>  
<PostalAddress>
<Street>xxxxx</Street>
<Street>xxxxx</Street>
<City>xxxxx</City>
<PostalCode>xxxxx</PostalCode>
<Country isoCountryCode="DE">xxxxx</Country>  
</PostalAddress>
</Contact>
</InvoicePartner>
<InvoicePartner>
<Contact role="billTo">  
<Name xml:lang="de">xxxxx</Name>  
<PostalAddress name="xxxxx">  
<Street>xxxxx</Street>
<City>xxxxx</City>
<PostalCode>xxxxx</PostalCode>
<Country isoCountryCode="DE">xxxxx</Country>  
</PostalAddress>
<Phone>
<TelephoneNumber>
<CountryCode isoCountryCode="DE">  
</CountryCode>
<AreaOrCityCode>
</AreaOrCityCode>
<Number>
</Number>
</TelephoneNumber>
</Phone>
<Fax>
<TelephoneNumber>
<CountryCode isoCountryCode="DE">  
</CountryCode>
<AreaOrCityCode>
</AreaOrCityCode>
<Number>
</Number>
</TelephoneNumber>
</Fax>
</Contact>
</InvoicePartner>
<InvoicePartner>
<Contact role="from">  
<Name xml:lang="de">Diesen String benötige ich</Name>  
140447
Lösung 140447 08.08.2019 aktualisiert um 13:02:12 Uhr
Goto Top
Danke.
Bidde:
@echo off
set "quelle=D:\data.xml"  
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -NoP -C "([xml](gc '%quelle%')).SelectSingleNode('/cXML/Request/InvoiceDetailRequest/InvoiceDetailRequestHeader/InvoicePartner/Contact[@role=\"from\"]/Name').'#text'"') do set "LeckerString=%%a"  
echo %LeckerString%
Ciao.
Nagus
Nagus 08.08.2019 um 14:13:17 Uhr
Goto Top
Perfekt! Ich danke Dir!!