murmeltier01
Goto Top

XML Datei in CSV umwandeln

Hallo zusammen,

ich weiß, das Thema wurde bereits mehrfach behandelt, aber leider komme ich zu keinem vollständigen Ergebnis.
Ich habe eine XML Datei und muss diese in eine csv umwandeln.
Nach vielen Versuchen mit diversen online Tools, Powershell und Converter bin ich am Ende mit meinem Latein.

Hier die xml Datei:
<?xml version="1.0" encoding="utf-8"?>  
<inventory type="full" year="2021" month="04" day="12" numbooks="7150">  
	<**book id="2987289"**>  
		<item name="action">update</item>  
		<item name="identity">  
			<item name="bookid">2987289</item>  
			<item name="meta_id"/>  
			<item name="iscp">3753450650</item>  
			<**item name="isbn13_ebook" type="epub">9783753450650</item**>  
			<item name="isbn13_print">9783753443997</item>  
			<item name="isbn13_substitute"/>  
			<item name="issn"/>  
		</item>
		<item name="publishinfo">  
			<**item name="author">Yassamin - Sophia Boussaoud</item**>  
			<item name="editor"/>  
			<item name="translator"/>  
			<**item name="title">Straßengedichte</item**>  
			<**item name="subtitle">Begegnungen</item**>  
			<**item name="publisher" code="28049">Books on Demand</item**>  
			<item name="series"/>  
			<**item name="numpages">54</item**>  
			<**item name="booksize" type="epub">323</item**>  
			<item name="releaseyear" type="year">2021</item>  
			<item name="edition" number="1"/>  
			<**item name="language" code="de">German</item**>  
			<item name="available_presentations">DL</item>  
			<**item name="available_formats">ePUB</item**>  
			<**item name="devices">PC/MAC/eReader/Tablet</item**>  
			<item name="category" code="247" parent="0">Belletristik / Romane</item>  
			<item name="category" code="1318" parent="247">Lyrik / Gedichte</item>  
			<item name="age_range" type="from"/>  
			<item name="age_range" type="to"/>  
			<item name="subject" type="bisac" code="POE000000">POETRY / General</item>  
			<item name="subject" type="wgs" code="9151">Belletristik / Lyrik, Dramatik / Lyrik</item>  
			<**item name="tags">Lyrik, Gedichte, Begegnungen, München</item**>  
			<**item name="description" type="short">Wir treffen im Schnitt 12 andere Menschen pro Tag. Manche kennen wir, einige vergessen wir und andere kennen wir nicht aber sie bleiben uns in Erinnerung. Straßengedichte Begegnungen erzählt lyrisch von ganz unterschiedlichen Begegnungen in der Münchner Innenstadt und davon, wie viele Arten von menschlicher Verbindung es gibt.&lt;br /&gt;&lt;br /&gt;Yassamin-Sophia Boussaoud benennt sich selbst als fette, Braune, arabisch gelesene Frau, die die Welt häufig so sieht, wie sie sein könnte. Auf dem Instagram Account @minaandherchaos teilt sie unter anderem Gedichte und betreibt intersektional feministischen Aktivismus.   Sie liebt den Regen, Käsekuchen und ihre Freund*innen.</item**>  
			<item name="description" type="extract"/>  
			<item name="image" type="cover_big">http://www.ciando.com/img/books/width167/3753450650_k.jpg</item>  
			<item name="image" type="cover_small">http://www.ciando.com/img/books/big/3753450650_k.jpg</item>  
			<item name="image" type="cover_thumb">http://www.ciando.com/img/books/3753450650_k.jpg</item>  
			<item name="image" type="cover_original">http://www.ciando.com/img/books/original/3753450650.jpg</item>  
			<item name="look_inside" recordcount="0"/>  
			<item name="search_full_text">0</item>  
			<item name="cd_to_book">0</item>  
			<item name="cd_link"></item>  
			<item name="toc"/>  
			<item name="widget"/>  
			<item name="extract"/>  
			<item name="last_update" type="cover_original">20210322</item>  
		</item>
		<item name="chapters" recordcount="0"/>  
		<item name="economy">  
			<**item name="price" type="full" currency="EUR" country="DE">299</item**>  
			<item name="price" type="full" currency="CHF" country="CH">300</item>  
			<item name="price" type="full" currency="EUR" country="AT">299</item>  
			<item name="price" type="print" currency="EUR" country="WW">299</item>  
			<item name="special_condition">25</item>  
		</item>
		<item name="rights">  
			<item name="delivery_date" type="announced">20210320</item>  
			<item name="geo_right">AT,BE,BG,CH,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IT,LT,LU,LV,MT,NL,NO,PL,PT,RO,SE,SI,SK</item>  
			<item name="status" code="1">aktiv</item>  
			<item name="resell_allowed">0</item>  
			<item name="agency_model">0</item>  
			<item name="fsk"/>  
			<item name="license" type="endnutzer" restriction="0">1</item>  
		</item>
		<item name="technology" recordcount="1">  
			<**item name="techinfo" format="EPUB" drm="watermark" presentation="DL" license="endnutzer"**>  
				<item name="copy" type="all"/>  
				<item name="print" type="all"/>  
				<item name="download">5</item>  
				<item name="reload">1</item>  
				<item name="delivery">sync.ciando.com</item>  
			</item>
		</item>
	</book>
</inventory>

Die Datei, die ich konvertieren muss ist knapp 500MB groß, d.h. es kommen dann die selben "Buchdaten" von knapp 10.000 Büchern.
Die Fett markierten Stellen müssen nur übernommen werden und ideal wäre natürlich dass der Preis als 2,99 Euro (also mit Komma) übernommen wird und die Sonderzeichen und Umlaute direkt ausgebessert werden.

Ich glaube, ich hab irgendwo einen Denkfehler, da alle Felder "item name" heißen und ich die Differenzierung einfach nicht korrekt hin bekomme.

Vielen Dank schon mal für eure Hilfe.

murmeltier01
Kommentar vom Moderator tomolpi am 19.04.2021 um 15:53:23 Uhr
Codetags hinzugefügt

Content-Key: 665853

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: em-pie
em-pie 18.04.2021 aktualisiert um 17:52:39 Uhr
Goto Top
Moin,

und das beinahe 1:1-Beispiel von "uns" hast du auch gefunden und versucht?

@colinardo hat es ja quasi für einen anderen Fall schon nachgebaut, wobei der Aufbau der XML bei dir natürlich etwas anders ist.

Gruß
em-pie
Mitglied: murmeltier01
murmeltier01 18.04.2021, aktualisiert am 19.04.2021 um 15:53:38 Uhr
Goto Top
Hallo em-pie,

ja, ich habe es nach dem Beispiel nachgebaut - oder zumindest versucht. Aber die erzeugte csv-Datei ist leer.

Hier mal meine Konvertierung. Wahrscheinlich hab ich irgendwo einen ganz blöden Denkfehler.

param(
    [parameter(mandatory=$true)][string]$xmlpath
)
$xml = new-Object XML; $xml.Load($xmlpath)
$bookid = $xml.inventory.book.bookid
$xml.inventory.book.bookitem | %{
    foreach($subitem in $_.Subitem){
   [pscustomobject] @{
    CiandoID = $ciandoid
    ISBN = $isbn13_ebook
    Autor = $author
    Titel = $title
    Untertitel = $subtitle
    Verlag = $publisher
    Seitenzahl = $numpages
    Sprache = $language
    Format = $available_formats
    Ausgabe = $devices
    Kategorie = $category
    Beschreibung = $tags
    Preis = $price
    TechnischeInfo = $techinfo
    }
   }
} | export-csv "$([System.IO.Path]::GetDirectoryName($xmlPath))\$([System.IO.Path]::GetFilenameWithoutExtension($xmlPath)).csv" -Delimiter ";" -NoType -Encoding UTF8  

Aber die Kinder sind jetzt im Bett, vielleicht finde ich noch den Fehler in Ruhe...

Trotzdem vielen Dank.

murmeltier01
Mitglied: colinardo
Lösung colinardo 19.04.2021 aktualisiert um 10:47:03 Uhr
Goto Top
Servus Murmeltier, willkommen auf Administrator.de!
param(
    [parameter(mandatory=$true)][string]$xmlpath
)
# XML Datei einlesen
$xml = new-Object XML; $xml.Load($xmlpath)
$xml.inventory.book | %{
    # erstelle custom object mit den gewünschten Eigenschaften
    [pscustomobject] @{
        BookId = $_.Id
        isbn13_ebook = $_.SelectSingleNode("item[@name='identity']/item[@name='isbn13_ebook']").innerText  
        author = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='author']").innerText  
        title = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='title']").innerText  
        subtitle = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='subtitle']").innerText  
        publisher = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='publisher']").innerText  
        numpages = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='numpages']").innerText  
        booksize = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='booksize']").innerText  
        language = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='language']").innerText  
        available_formats = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='available_formats']").innerText  
        devices = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='devices']").innerText  
        tags = $_.SelectSingleNode("item[@name='publishinfo']/item[@name='tags']").innerText  
        description = ($_.SelectSingleNode("item[@name='publishinfo']/item[@name='description']").innerText -replace '<br\s*/?>',"`r`n") -replace '<[^>]+>'  
        price = [int]$_.SelectSingleNode("item[@name='economy']/item[@name='price' and @type='full' and @currency='EUR']").innerText / 100  
        format = $_.SelectSingleNode("item[@name='technology']/item[@name='techinfo']").format  
        drm = $_.SelectSingleNode("item[@name='technology']/item[@name='techinfo']").drm  
        presentation = $_.SelectSingleNode("item[@name='technology']/item[@name='techinfo']").presentation  
        license = $_.SelectSingleNode("item[@name='technology']/item[@name='techinfo']").license  
    }
} | export-csv "$([System.IO.Path]::GetDirectoryName($xmlPath))\$([System.IO.Path]::GetFilenameWithoutExtension($xmlPath)).csv" -Delimiter ";" -NoType -Encoding UTF8  
Bei ergänzenden individuellen Anpassungen bitte PN

Grüße Uwe
Mitglied: murmeltier01
murmeltier01 19.04.2021 um 14:12:18 Uhr
Goto Top
Vielen, vielen Dank Uwe.

Klappt einwandfrei. Jetzt kapier ich auch, wo meine doch eher großen Fehler waren.

Vielen Dank und eine schöne Woche.

murmeltier01
Mitglied: colinardo
colinardo 19.04.2021 aktualisiert um 15:45:07 Uhr
Goto Top
Zitat von @murmeltier01:
Klappt einwandfrei. Jetzt kapier ich auch, wo meine doch eher großen Fehler waren.
Freut mich für dich.
Vielen Dank und eine schöne Woche.
Wünsche ich ebenso.

Grüße Uwe