Jump to content

XML Datei bearbeiten


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

ich hoffe mir kann jemand einen Denkanstoß geben oder auch helfen, Scripting PowerShell.

Ich habe eine XML Datei, dort sind mehrere Knoten vorhanden, Auszug aus der Datei:

Ich meine mit Knoten:     -<Stat>     bis     </Stat>

 

 

-<SctiesFincgRptgTxStatRpt>
  -<TradData>
     -<Stat>
          <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId>
         +<CtrPtyData>
         +<LnData>
         +<CollData>
         +<CtrctMod>
      </Stat>
     -<Stat>
          <TechRcrdId>WKTHUTDREPxxSCDxxSFTRxxSFTxx487335</TechRcrdId>
         +<CtrPtyData>
         +<LnData>
         +<CollData>
         +<CtrctMod>
      </Stat>
     -<Stat>
          <TechRcrdId>KRTHUTDEKDxxSCDxxSFTRxxSFTxx487339</TechRcrdId>
         +<CtrPtyData>
         +<LnData>
         +<CollData>
         +<CtrctMod>
      </Stat>

 

Ich möchte die XML Datei nach allen Knoten durchsuchen, wenn einer gefunden wurde, soll dieser in einer neuen XML Datei abgespeichert werden.

So das ich für jeden Knoten eine separate Datei bekomme.

Zum durchsuchen der Datei, dachte ich an eine Schleife, aber meine XML Kenntnisse zum Aufbau sind wohl nicht gut genug. Bekomme noch keine Ergebnisse.

Kann mir jemand bei dem oben geschrieben helfen ?

$StatXmlData = [xml](Get-Content "D:\test.xml")
$node = $StatXmlData.Backups.Stat
$Statnames = @()

foreach ($entry in $node)
{
	$Statnames = $Statnames + $entry.TechRcrdId
}

Write-host $Statnames

 

Link zu diesem Kommentar

Ich bin weit davon entfernt XML wirklich zu verstehen. Und ich bin noch viel weiter davon entfernt, ein Fan von XML zu sein. Wenn irgendwie möglich mache ich einen riesengroßen Bogen um XML.

 

So ... da das XML-Schnipselchen, welches Du gepostet hast, kein valides XML ist und man es so nicht verwenden kann, hab ich es mal auf etwas Benutzbares eingekürzt. ;-)

<?xml version="1.0"?>
<SctiesFincgRptgTxStatRpt>
    <TradData>
        <Stat>
            <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId>
        </Stat>
        <Stat>
            <TechRcrdId>WKTHUTDREPxxSCDxxSFTRxxSFTxx487335</TechRcrdId>
        </Stat>
        <Stat>
            <TechRcrdId>KRTHUTDEKDxxSCDxxSFTRxxSFTxx487339</TechRcrdId>
        </Stat>
    </TradData>
</SctiesFincgRptgTxStatRpt>

Angenommen, wir haben das in der Datei D:\sample\test.xml gespeichert, können wir mit folgendem Code die einzelnen TechRcrdId's auslesen.

$StatXmlData = [xml](Get-Content D:\sample\test.xml)
$node = $StatXmlData.SctiesFincgRptgTxStatRpt.TradData.ChildNodes

foreach ($entry in $node){
    $entry
}

 

Was möchtest Du denn mit den extrahierten Daten anstellen? 

 

Hier noch ein bissl Lektüre zum Thema XML mit Powershell:

https://www.petri.com/creating-custom-xml-net-powershell

oder hier:

https://searchwindowsserver.techtarget.com/tip/Using-PowerShell-to-create-XML-documents

oder hier noch was vom Dr. Tobias:  ;-) 

https://www.powershellmagazine.com/2013/08/19/mastering-everyday-xml-tasks-in-powershell/

 

 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hallo,

 

Danke für den Hinweis, ich hätte es jetzt so gemacht. Deine Lösung ist eleganter.

$StatTradDataXmlData = [xml](Get-Content "D:\sample\test.xml")
$node = $StatTradDataXmlData.SctiesFincgRptgTxStatRpt.TradeData
$Statnames = @()

foreach ($entry in $node)
{
	$Statnames = $Statnames + $entry.Stat
}

Write-host $Statnames

Ich möchte für jeden extrahierten Knoten ein neues XML File erstellen, wo nur der gefunden Knoten enthallten ist

 

Als Beispiel:

 

<?xml version="1.0"?>
<SctiesFincgRptgTxStatRpt>
    <TradData>
        <Stat>
            <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId>
        </Stat>
    </TradData>
</SctiesFincgRptgTxStatRpt>

Ja, XML ist für mich schwer, habe mich in der Zwischenzeit über den XML Aufbau etwas eingelesenen.

Link zu diesem Kommentar
vor 4 Minuten schrieb epsodus:

Ich möchte für jeden extrahierten Knoten ein neues XML File erstellen, wo nur der gefunden Knoten enthallten ist

Hmmm ... das hatte ich verstanden, aber wozu? Was willst Du mit den neu erzeugten Dateien anstellen?

 

Genau genommen brauchst Du die Schleife bei Powershell nicht mal. Wenn Du die ID's nur ausgeben willst, reicht auch das hier:

$StatXmlData.SctiesFincgRptgTxStatRpt.TradData.ChildNodes

 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hi, wie soll ich das erklären, ich versuche es mal.

 

Es wird ein XML File zur Validierung verschickt ( exportiert ), für jeden User ein File, es können 100 user sein. Als Antwort

kommt eine Responesdatei ( Importdatei ) zurück. Jetzt kommt der Knackpunkt, in diesem File sind keine Userkennungen mehr drin. Sondern für jeden User gibt es eine Nummer die jedem User fest vergeben ist  ( z.B. ERTHUTDREPxxSCDxxSFTRxxSFTxx487331 ).

Daher muss ich das Importfile splitten, nach diesen Nummern und neu erstellen. Also beim schreiben des neuen Files, wird der Dateiname um diese besagte Nummer erweitert.

 

Anhand der Nummer kann ich einen Abgleich mit einem Excelsheet vornehmen, so das jeder User sein eigenes Responsesfile bekommt.

 

ich habe hier mal den Begriff User genommen, zur Erklärung

Link zu diesem Kommentar
vor 32 Minuten schrieb epsodus:

so das jeder User sein eigenes Responsesfile bekommt.

hmmm ... ok, und was macht der User dann damit?  Nimmer er einen Editor und schaut rein?

 

Wer erstellt die XML-Files zur Validierung? Warum kommt nur eine Response-Datei zurück und nicht für jeden User eine? Woher kommen die Nummern für jeden User? ... vielleicht aus dem AD?

Link zu diesem Kommentar

Bitte nicht falsch verstehen ... ich bin nicht unwillig, oder so zweifle Deinen angestrebten Workflow an. Ich finde die Arbeit mit XML und Powershell nur alles andere als intuitiv und einfach und versuche deshalb, für mich so weit wie möglich zu vermeiden, wirklich mit XML arbeiten zu müssen ... also sorry dafür.  ;-)

vor 31 Minuten schrieb epsodus:

Der User kann damit seine Exportdatei mit der validierten Importdatei abgleichen.

Tut er das manuell? Also öffnet der User die Datei und schaut für den Abgleich hinein? Wenn das so ist, muss es ja nicht zwingend eine valide XML-Datei sein, oder? Es würde eine Text-Datei genügen, die die nötigen Informationen enthält.  ;-) 

vor 31 Minuten schrieb epsodus:

Es kommt nur ein File zurück mit allen Antworten, darauf hat man keinen Einfluss

Was würde passieren, wenn man nur eine Datei zum validieren versenden würde? Vielleicht kann man das Aufsplitten in einzelne User-Dateien ja vermeiden, wenn man dem Validator nur einzelne User-Dateien verfüttert!? ;-) 

 

vor 38 Minuten schrieb epsodus:

Die Nummer für jeden User ist im Vorfeld festgelegt,

Und diese Zuordnung von User zu Nummer liegt nur in einer XLS-Datei vor? Eine CSV-Datei wäre für Powershell ein wenig einfacher zu verarbeiten. ;-) 

Link zu diesem Kommentar

Hallo,

Du meinst dazu ?

Was würde passieren, wenn man nur eine Datei zum validieren versenden würde? Vielleicht kann man das Aufsplitten in einzelne User-Dateien ja vermeiden, wenn man dem Validator nur einzelne User-Dateien verfüttert!?

 

Die Dateien werden getrennt auf verschiedenen Rechnern erstellt und versendet. Gesammelt wird auf der Gegenseite,

dann nur ein XML File erstellt.

Hier mal eine Beispiel Exceldatei, man darf hier wohl keine csv Datei ablegen , also xlsx

Zuordnung.xlsx

Link zu diesem Kommentar
vor 3 Minuten schrieb epsodus:

Was würde passieren, wenn man nur eine Datei zum validieren versenden würde?

Neeee ... ;-)  ob der Abgleich bei den Usern manuell erfolgt. Wenn die Anwender die XML-Datei einfach öffnen und mit ihren eigenen Äuglein reinschauen, um den Abgleich durchzuführen, dann wäre es meiner Meinung nach fast besser, wenn es keine XML-Dateien wären. XML-Dateien sind nicht für Menschen gemacht. (höchstens für Sadisten und Masochisten ;-) )

Link zu diesem Kommentar

Hi, 

das File wird dann automatisch verarbeitet

Solange es xml Fomat hat

Genau, (höchstens für Sadisten und Masochisten  )

 

Das XML Format ist ja mein Problem

Mein Problem ist es mit XLM umzugehen. Wenn man jetzt den Knoten identifiziert hat, wie erstelle ich dann für jeden Knoten ein XLM File, mit dem Knoten als Inhalt, wie oben beschrieben und setze die Nummer vorne als Namensbestandteil dran. 

 

Link zu diesem Kommentar

OK, dann versuche ich mal, das Ganze in Prosa zusammenzufassen:

 

Ihr habt eine Software, die für jeden Nutzer einzeln eine Datei irgendwohin verschickt, die für einen Validierungsprozess benötigt wird. 
Als Antwort für die einzeln verschickten Dateien, erhaltet ihr eine zusammengefasste Antwort-Datei, die die gesammelten "Antwort-Datensätze" für die einzelnen Anwender enthält.
Diese zusammengefasste Antwort-Datei muss jetzt in einem manuellen, externen, aufwändigen Prozess so aufbereitet werden, dass sie von den einzelnen Anwendern wieder als Abgleich verwendet werden und vom Programm eingelesen werden kann. Ist das erforderliche Format irgendwie dokumentiert?

Hab ich das soweit richtig verstanden?

Habt Ihr für die Software Geld bezahlt? Falls ja, würde ich entweder auf Minderung des Preises oder auf Nachbesserung bestehen. ;-)  ... mal ernsthaft, wenn das so ist, kann das nicht im Sinne des Erfinders sein.

 

Achso ...  wenn CSV-Dateien nicht gehen, änderst Du einfach die Endung auf txt und hängst die Datei so an.

 

Mal so aus Neugier an einen Mod (falls einer mitliest): warum sind CSV-Dateien nicht erlaubt?

bearbeitet von BOfH_666
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...