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

Printed on: April 16, 2024 at 11:04 o'clock

Mitglied: 135111
Solution 135111 Jan 09, 2018 at 16:47:26 (UTC)
Goto Top
Bitte gesamte XML posten, zumindest aber die ersten Zeilen bis zur gewünschten.
Member: noscript
noscript Jan 10, 2018 at 09:17:22 (UTC)
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
Solution 135111 Jan 10, 2018 updated at 09:46:47 (UTC)
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)
Member: noscript
noscript Jan 10, 2018 at 10:06:46 (UTC)
Goto Top
wenn ich das aufrufe erhalte ich folgenden Meldungen (siehe Screenshot).
xml
Mitglied: 135111
Solution 135111 Jan 10, 2018 updated at 10:46:33 (UTC)
Goto Top
Du verwendest eine zu alte Powershell. Wurde hier einwandfrei getestet!
Mitglied: 135111
Solution 135111 Jan 10, 2018 updated at 11:23:19 (UTC)
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
Member: noscript
noscript Jan 10, 2018 at 12:41:00 (UTC)
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 Jan 10, 2018 updated at 12:48:00 (UTC)
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)
}
Member: noscript
noscript Jan 10, 2018 at 12:58:36 (UTC)
Goto Top
vielen vielen Dank, Fuerte! face-smile face-smile
Member: noscript
noscript Jan 30, 2018 at 09:56:42 (UTC)
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.