tralveller
Goto Top

XML Datei mit PowerShell in mehrere XML splitten (inkl. Zeilenumbrüche)

Hallo zusammen,

ich möchte eine XML-Catalog-Datei von Dell mit mehreren Einträgen in einzelne XML-Dateien aufteilen.

Dabei bin ich bereits hier im Forum auf eine Lösung gestoßen:
XML Datei mit Powershell splitten

Jedoch wird in meinem Fall die neu erzeugte Datei ohne Zeilenumbrüche erzeugt und der gesamte Dateiinhalt in eine Zeile wiedergeben.

Das PowerShell-Skript sieht wie folgt aus:
$xml = [xml](Get-Content "CatalogPC.xml")  
$xml.SelectNodes("//SoftwareComponent") | %{  
	$name = $_.identifier + ".xml"  
	"<?xml version=`"1.0`" encoding=`"utf-16`"?><SoftwareComponent>$($_.outerXML)</SoftwareComponent>" | set-content -Encoding utf8 $name  
	}

Ich habe im Verdacht, dass es etwas mit der Codierung/Encoding zu tun hat.
Jedoch bin ich mit der Angabe verschiedener Codierungen wie "UFT8", "bigendianunicode" bei "Get-Content"/"set-content" bisher nicht auf die Lösung gekommen face-confused

Hat jemand eine Idee, wo der Fehler sein könnte? face-smile

Die eingelesene Datei ist Unicode bzw. Notepad++ nach in "UCS-2 LE BOM" kodiert:
<?xml version="1.0" encoding="utf-16"?> 
<Manifest baseLocation="downloads.dell.com" dateTime="2020-08-17T13:37:15+05:30" releaseID="XT3XX" version="20.08.17" identifier="d7949e25-f9f6-43b3-9026-cc0975a4b71b" predecessorID="05bac99d-7e19-4d48-9770-b6446e21ec6a"> 
  <ReleaseNotes>
    <Display lang="en"><![CDATA[Dell Version Control Catalog is an aggregation of all Dell Update Package(DUP)s metadata currently released on downloads.dell.com]]></Display> 
  </ReleaseNotes>
  <InventoryComponent schemaVersion="2.0" releaseID="VWVNY" hashMD5="13cd6d48e938cc4f5ee33aca5a1551d9" size="17464032" path="FOLDER06510790M/1/InvColPC_8.2.8.0.exe" dateTime="08/20/2020" releaseDate="August 20,2020" vendorVersion="8.2.8.0" dellVersion="A00" osCode="WIN" /> 
  <SoftwareComponent schemaVersion="2.0" identifier="4f2ba279-a949-4eab-ad5e-013ce5b41c3f" packageID="99DDD" releaseID="99DDD" hashMD5="a80be7463e1be35704d9e954ce8b063b" path="FOLDER05035765M/6/Realtek-High-Definition-Audio-Driver_99DDD_WIN_6.0.1.8454_A02_03.EXE" dateTime="2018-06-04T08:22:52Z" releaseDate="July 21, 2020" vendorVersion="6.0.1.8454" dellVersion="A02" packageType="LWXP" size="166950288"> 
    <Name>
      <Display lang="en"><![CDATA[Realtek High Definition Audio Driver,6.0.1.8454,A02]]></Display> 
    </Name>
    <ComponentType value="DRVR"> 
      <Display lang="en"><![CDATA[Driver]]></Display> 
    </ComponentType>
    <Description>
      <Display lang="en"><![CDATA[This package contains the driver for Realtek High Definition audio. Audio driver is the software that helps your operating system to communicate with audio devices such as sound cards and speakers.]]></Display> 
    </Description>
    <Category value="AU"> 
      <Display lang="en"><![CDATA[Audio]]></Display> 
    </Category>
    <SupportedDevices>
      <Device componentID="100352" embedded="false"> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="07B3" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="0814" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="0818" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="0819" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="081E" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="081F" subVendorID="1028" /> 
        <PCIInfo deviceID="0256" vendorID="10EC" subDeviceID="0820" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="0831" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="0832" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="0889" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="088A" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="1831" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="1832" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="1889" subVendorID="1028" /> 
        <PCIInfo deviceID="0289" vendorID="10EC" subDeviceID="188A" subVendorID="1028" /> 
        <Display lang="en"><![CDATA[Realtek High Definition Audio]]></Display> 
      </Device>
    </SupportedDevices>
    <SupportedOperatingSystems>
      <OperatingSystem osCode="IOT01" osVendor="Microsoft" majorVersion="10" minorVersion="0" spMajorVersion="0" spMinorVersion="0" osArch="x64"> 
        <Display lang="en"><![CDATA[Windows 10 64-Bit]]></Display> 
      </OperatingSystem>
      <OperatingSystem osCode="W10H4" osVendor="Microsoft" majorVersion="10" minorVersion="0" spMajorVersion="0" spMinorVersion="0" osArch="x64"> 
        <Display lang="en"><![CDATA[Windows 10 64-Bit]]></Display> 
      </OperatingSystem>
      <OperatingSystem osCode="W10P4" osVendor="Microsoft" majorVersion="10" minorVersion="0" spMajorVersion="0" spMinorVersion="0" osArch="x64"> 
        <Display lang="en"><![CDATA[Windows 10 64-Bit]]></Display> 
      </OperatingSystem>
    </SupportedOperatingSystems>
    <LUCategory value="NONE"> 
      <Display lang="en"><![CDATA[NONE]]></Display> 
    </LUCategory>
    <SupportedSystems>
      <Brand key="4" prefix="LAT"> 
        <Display lang="en"><![CDATA[Latitude]]></Display> 
        <Model systemID="07B3"> 
          <Display lang="en"><![CDATA[3189]]></Display> 
        </Model>
        <Model systemID="0814"> 
          <Display lang="en"><![CDATA[5495]]></Display> 
        </Model>
        <Model systemID="0818"> 
          <Display lang="en"><![CDATA[5491]]></Display> 
        </Model>
        <Model systemID="0819"> 
          <Display lang="en"><![CDATA[5591]]></Display> 
        </Model>
        <Model systemID="081E"> 
          <Display lang="en"><![CDATA[3190]]></Display> 
        </Model>
        <Model systemID="081F"> 
          <Display lang="en"><![CDATA[3190-2-in-1]]></Display> 
        </Model>
      </Brand>
      <Brand key="11" prefix="PRE"> 
        <Display lang="en"><![CDATA[Precision]]></Display> 
        <Model systemID="0831"> 
          <Display lang="en"><![CDATA[7530]]></Display> 
        </Model>
        <Model systemID="1831"> 
          <Display lang="en"><![CDATA[7530]]></Display> 
        </Model>
        <Model systemID="0832"> 
          <Display lang="en"><![CDATA[7730]]></Display> 
        </Model>
        <Model systemID="1832"> 
          <Display lang="en"><![CDATA[7730]]></Display> 
        </Model>
        <Model systemID="0820"> 
          <Display lang="en"><![CDATA[3530]]></Display> 
        </Model>
      </Brand>
    </SupportedSystems>
    <ImportantInfo URL="http://www.dell.com/support/home/us/en/19/Drivers/DriversDetails?driverId=99DDD" /> 
    <Criticality value="1"> 
      <Display lang="en"><![CDATA[Recommended]]></Display> 
    </Criticality>
  </SoftwareComponent>
</Manifest>

Danke vielmals und Grüße
Tralveller

Content-ID: 599353

Url: https://administrator.de/forum/xml-datei-mit-powershell-in-mehrere-xml-splitten-inkl-zeilenumbrueche-599353.html

Ausgedruckt am: 25.12.2024 um 16:12 Uhr

145033
Lösung 145033 26.08.2020 aktualisiert um 16:56:44 Uhr
Goto Top
Das hat nichts mit dem Encoding zu tun denn Set-Content schreibt es so weg wie du es selbst formatierst, das kennt ja kein XML, du musst entweder die entsprechende Methode zum Abspeichern eines XML-Objects nutzen oder alternativ einen 'System.Xml.XmlWriter' Object verwenden. Erst dann wird XML "pretty" ausgegeben.

Zeile 4 ersetzen durch (Ausgabe-Ordner anpassen)

([xml]"<?xml version=`"1.0`" encoding=`"utf-16`"?><SoftwareComponent>$($_.outerXML)</SoftwareComponent>").Save("C:\Ordner\$name") 
erikro
Lösung erikro 26.08.2020 um 20:16:59 Uhr
Goto Top
Moin,

wie der Kollege schon richtig sagte: Nimm die Methoden der Powershell, wenn Du XML manipulieren willst. Hier ein paar Links:

https://www.langlitz-it.de/?p=1297
https://www.heise.de/ix/artikel/Datenzugriff-506816.html
https://www.powershellmagazine.com/2013/08/19/mastering-everyday-xml-tas ...

Vor allem der letzte ist für Dein Problem interessant. Welcher Teil, verrate ich nicht. Du musst schon alles lesen. face-wink

Liebe Grüße

Erik
tralveller
tralveller 27.08.2020 aktualisiert um 01:53:26 Uhr
Goto Top
Hallo @kleiner,

du hast vollkommen recht!
Da habe ich mich wohl durch ein altes Problem fehlleiten lassen face-sad

Nachfolgend für alle anderen die Lösung, welche ebenfalls nach danach suchen face-smile
$xml = [xml](Get-Content -Encoding Unknown "CatalogPC.xml")  
$xml.SelectNodes("//SoftwareComponent") | %{  
	$name = $_.identifier + ".xml"  
	([xml]"<?xml version=`"1.0`" encoding=`"utf-16`"?><SoftwareComponent>$($_.outerXML)</SoftwareComponent>").Save($name)  
	}

@erikro, vielen Dank für die Links!
https://www.langlitz-it.de/?p=1297
https://www.heise.de/ix/artikel/Datenzugriff-506816.html
https://www.powershellmagazine.com/2013/08/19/mastering-everyday-xml-tas ...
Die letzten zwei Links kannte ich bisher nicht und sind sicherlich für mich und andere das ein oder andere Mal hilfreich face-cool face-wink face-smile face-smile