noscript
Goto Top

XML-Inhalt austauschen

Hallo zusammen

Nachdem ich nun das komplette Internet gefühlt zwei Mal gelesen, aber nicht kapiert habe, versuch ichs nun auf diesem Weg.

Meine Ausgangslage:
Ich kriege täglich mehrere XML's angeliefert welche in Zeile 15 folgenden Inhalt haben " <ProviderId>www.sda-ats.ch</ProviderId>"
In dieser Zeile muss ich den Wert "www.sda-ats.ch" auf "RDO" ändern.
Das Batch soll alle paar Sekunden eine Abfrage starten, falls neue Files angeliefert wurden. Aber das kann ich ja dann über die Aufgabenplanung lösen.
Sprich es geht eigentlich nur um das Austauschen des Inhalts.

Mein Problem:
Ich hab in diesem Forum so viele Lösungsansätze gesehen, dass ich mittlerweile den Wald vor lauter Bäumen nicht mehr sehe.
Vermutlich ist das für eine Klacks, aber ich steh gerade sowas von auf dem Schlauch..

Grüsse vom Bodensee

Content-Key: 360458

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: 135111
Lösung 135111 09.01.2018 um 17:47:26 Uhr
Goto Top
Bitte gesamte XML posten, zumindest aber die ersten Zeilen bis zur gewünschten.
Mitglied: noscript
noscript 10.01.2018 um 10:17:22 Uhr
Goto Top
<?xml version="1.0" encoding="ISO-8859-15"?> 
<!DOCTYPE NewsML PUBLIC "urn:newsml:iptc.org:20031010:NewsMLv1.2.dtd:1" "NewsML-1.2.dtd" 
[<!ENTITY % nitf SYSTEM "nitf-3-0.dtd"> %nitf; ]> 
<NewsML>
  <Catalog Href="www.sda.ch/newsml/topics/SDACatalog.xml"/> 
  <NewsEnvelope>
    <DateAndTime>20180109T082007+0100</DateAndTime>
    <NewsService FormalName="SDA-ATS News Service"/> 
    <NewsProduct FormalName="Regionaldienst Ostschweiz"/> 
    <Priority FormalName="3"/> 
  </NewsEnvelope>
  <NewsItem>
    <Identification>
      <NewsIdentifier>
        <ProviderId>www.sda-ats.ch</ProviderId>

das ganze XML wäre etwas lang, rund 140 Zeilen.
Mitglied: 135111
Lösung 135111 10.01.2018 aktualisiert um 10:46:47 Uhr
Goto Top
Hier als Powershell:
$xmlpath = 'C:\data.xml'  
$xml = [xml](gc $xmlpath)
$xml.SelectSingleNode("/NewsML/NewsItem[1]/Identification/NewsIdentifier/ProviderId").'#text' = 'RDO'  
$xml.Save($xmlpath)
Mitglied: noscript
noscript 10.01.2018 um 11:06:46 Uhr
Goto Top
wenn ich das aufrufe erhalte ich folgenden Meldungen (siehe Screenshot).
xml
Mitglied: 135111
Lösung 135111 10.01.2018 aktualisiert um 11:46:33 Uhr
Goto Top
Du verwendest eine zu alte Powershell. Wurde hier einwandfrei getestet!
Mitglied: 135111
Lösung 135111 10.01.2018 aktualisiert um 12:23:19 Uhr
Goto Top
Wenn du eine ältere Powershell hast kannst du es auch so machen:
$xmlpath = 'C:\data.xml'  
$xml = New-Object XML
$xml.XmlResolver = $null
$xml.Load($xmlpath)
$xml.SelectSingleNode("/NewsML/NewsItem[1]/Identification/NewsIdentifier/ProviderId").'#text' = 'RDO'  
$xml.Save($xmlpath)

Oder hier noch die Variante via VBS falls dir Powershell nicht liegt...
Const PATH = "C:\data.xml"  
Set xml = CreateObject("MSXML2.DomDocument.6.0")  
xml.resolveExternals = False
xml.setProperty "ProhibitDTD",False  
xml.validateOnParse = False
xml.async = False
xml.load(PATH)
If xml.parseError.errorCode  <> 0 Then
	MsgBox xml.parseError.reason & vbNewline & "Line: " & xml.parseError.line & "# Position: " & xml.parseError.linepos  
End If
Set node = xml.selectSingleNode("/NewsML/NewsItem[1]/Identification/NewsIdentifier/ProviderId")  
If Not node Is Nothing Then
	node.text = "RDO"  
	xml.save PATH
End If
Mitglied: noscript
noscript 10.01.2018 um 13:41:00 Uhr
Goto Top
Hallo Fuerte

Hab die Powershell aktualisiert (von 2 auf 4) und nun läufts einwandfrei! face-smile

Eine Frage hätte ich noch.
Wenn ich nun mehrere Files mit unterschiedlichen Filenamen habe, wie löse ich das?
Meine Logik würds dann so lösen, was natürlich nicht funktioniert:
$xmlpath = '$xmlpath = 'D:\*.xml'   
Mitglied: 135111
135111 10.01.2018 aktualisiert um 13:48:00 Uhr
Goto Top
Warum nicht gleich ...Mit Get-ChildItem die Dateien auflisten und dann eine Foreach-Schleife drum pappen.

gci 'c:\*.xml' -File | %{  
    $xml = New-Object XML
    $xml.XmlResolver = $null
    $xml.Load($_.Fullname)
    $xml.SelectSingleNode("/NewsML/NewsItem[1]/Identification/NewsIdentifier/ProviderId").'#text' = 'RDO'  
    $xml.Save($_.Fullname)
}
Mitglied: noscript
noscript 10.01.2018 um 13:58:36 Uhr
Goto Top
vielen vielen Dank, Fuerte! face-smile face-smile
Mitglied: noscript
noscript 30.01.2018 um 10:56:42 Uhr
Goto Top
habe noch eine zusatzfrage.

<?xml version="1.0" encoding="ISO-8859-15"?> 
<!DOCTYPE NewsML PUBLIC "urn:newsml:iptc.org:20031010:NewsMLv1.2.dtd:1" "NewsML-1.2.dtd"[<!ENTITY % nitf SYSTEM "nitf-3-0.dtd"> %nitf; ]> 
<NewsML>
  <Catalog Href="www.sda.ch/newsml/topics/SDACatalog.xml" /> 
  <NewsEnvelope>
    <DateAndTime>20180109T082007+0100</DateAndTime>
    <NewsService FormalName="SDA-ATS News Service" /> 
    <NewsProduct FormalName="Regionaldienst Ostschweiz" /> 
    <Priority FormalName="3" /> 
  </NewsEnvelope>

wenn ich hier die zeile 7 bearbeiten möchte, was muss ich da tun?
möchte auch hier den text von "SDA-ATS News Service" zu "Schweiz" ändern.
habe versucht das script oben anzupassen. kriegs aber nicht hin.