Jump to content

Proll012

Members
  • Gesamte Inhalte

    29
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von Proll012

  1. Hallo, 

     

    Ich versuche mit diesem Programm in der "Root-Node" einen Attributwert zu löschen bzw. durch nichts zu ersetzen. Ich habe auch schon andere Wege ausprobiert aber die haben nicht Funktioniert.

    Folgendes Skript schafft es wenigstens die Datei erfolgreich zu bearbeiten, wenn nur eine Datei im Verzeichnis liegt.:rolleyes::lol2:

    $quellpfad ="C:\Users\Oho\Desktop\LinkEntfernerTest"
    $XmlData = get-ChildItem $quellpfad "*.xml" 
    Foreach-Object{
    $XMLFile = get-content $XmlData.Fullname 
    $NewRawXML = $XMLFile|%{
    	if ($_ -match '\<BMECAT\s*'){
    		$_ -replace '\s*xmlns\=".*"','' 
    }
    			else{
    				$_
    }
    }
    $NewRawXML
    ([xml]$NewRawXML).save($XmlData.FullName)
    }

    Wenn zwei oder mehr Dateien vorhanden sind bekomme ich folgenden Fehler..

    Der Wert "System.Object[]" kann nicht in den Typ "System.Xml.XmlDocument" konvertiert werden. Fehler: "Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein.

    Kann mir da jemand weiterhelfen? :eye2:

     

  2. Nicee danke dir, 

     

    $quellpfad ="C:\Users\MeinName\Desktop\Experiment,Test"
    $XmlData = get-ChildItem $quellpfad "*.xml" -Recurse
    foreach ($xmlobject in $XmlData) {
    [xml]$xml = get-content $xmlobject.Fullname
    foreach ($Feature in ($xml.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES).FEATURE ) {
    if ($Feature.FVALUE -match ";") {
        $SplittedFVALUE = ($Feature.FVALUE -split ';').trim()
        foreach ($Value in $SplittedFVALUE) {                   
            $child = $xml.CreateNode("element", "FVALUE", " ")        
            $child.InnerText = $Value      
            $Feature.AppendChild($child)
            }   
            $ItemToRemove = $Feature.SelectSingleNode('FVALUE')
            $Feature.RemoveChild($ItemToRemove)
             }
           } 
    $xml.Save($xmlobject.Fullname)
    }

    So funktionierts :)))))))) bis jetzt. 

  3. Am 5.10.2021 um 15:36 schrieb BOfH_666:

    das komplette Skript.  ;-) 

    Gesagt, getan. 

    $quellpfad ="C:\Users\MeinName\Desktop\XmlFutterTest"
    $XmlData = get-ChildItem $quellpfad "=.xml" -Recurse
    foreach ($xmlobject in $XmlData) {
    [xml]$xml = get-content $xmlobject.Fullname
    foreach ($Feature in ($xmlobject.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES).FEATURE ) {
    if ($Feature.FVALUE -match ";") {
        $SplittedFVALUE = ($Feature.FVALUE -split ';').trim()    
        foreach ($Value in $SplittedFVALUE) {                  
            $child = $xmlobject.CreateNode("element", "FVALUE", " ")       
            $child.InnerText = $Value      
            $Feature.AppendChild($child)
            } 
             }
            $ItemToRemove = $Feature.SelectSingleNode('FVALUE')
            $Feature.RemoveChild($ItemToRemove)
             }
    $xml.Save($xmlobject.Fullname)
    }

    Holzweg? Formfehler? :lool: zumindest bekomme ich keinen Fehler angezeigt. Passieren tut aber auch nichts :/

  4. vor 7 Minuten schrieb NilsK:

    In der Save-Methode brauchst du aber den Dateinamen, unter dem die Datei gespeichert werden soll

    Puh keine Ahnung welche Variable ich dann angeben muss, damit der jede eingespielten Datei unter dem eingespielten Namen in ein anderes Verzeichnis speichert.:(

    vor 8 Minuten schrieb BOfH_666:

    Ich fürchte, Du haust da Einiges gehörig durcheinander

    Da bin ich mir sicher :lol2: ...:crying:

     

    $files = Get-ChildItem  C:\Users\sluet\Desktop\XmlFutterTest -Recurse *.xml  
    Foreach-Object {
        [xml]$XmlData = Get-Content $files
      }
    foreach ($Feature in ($XmlData.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES).FEATURE ) {
    if ($Feature.FVALUE -match ";") {
        $SplittedFVALUE = ($Feature.FVALUE -split ';').trim() 
        foreach ($Value in $SplittedFVALUE) {            
            $child = $XmlData.CreateNode("element", "FVALUE", " ")
            $child.InnerText = $Value
            $Feature.AppendChild($child) }}  
            $ItemToRemove = $Feature.SelectSingleNode('FVALUE')
            $Feature.RemoveChild($ItemToRemove)
             }
            $XmlData.Save($files)

     

    Könnt ihr mir denn sagen, was ich hier falsch mache? Versuche hier das Selbe wie oben.  

    Zu 

    Foreach-Object {[xml]$XmlData = Get-Content $files }
        			

    Gibt der mir ein Fehler aus. Das der dazu nichts findet. 

  5. vor 3 Minuten schrieb BOfH_666:

    Was genau steht denn in der Variablen "$FinishedXml"? 

    Das war nur ein Beispiel, das wäre $NewRawXML  im oben genannten Skript.

    Und darin sollte soweit ich richtig verstehe die überarbeitete Datei drin stehen. 

    vor 6 Minuten schrieb BOfH_666:

    And BTW: ... hab ich grad erst drauf geachtet - meistens ist es keine gute Idee, in einer XML-Datei mit einfachen String-Ersetzungen zu arbeiten. Was stört denn an den Attributen?

    Der Link von BMECAT muss raus dann erkennt PowerShell das als richtiges xml. Ergo wird FVALUE beim ";" gesplittet neu verknotet und der alte FVALUE wird dann auch gelöscht. 

    Es geht mir aber gar nicht so sehr darum. 

     

    Die Links manuell raus zu Löschen ist nicht so das Problem. :grins2:

     

    Viel mehr das manuelle eintragen einzelner Dateien. Haben zu Soll Pfad. 

    Aber ich versuche das nochmal, wenn ich richtig deute, habe ich wohl nur die Variable in .save($...) eingetragen. :D

     

     

     

  6. Moin Nils, 

     

    vor 3 Minuten schrieb NilsK:

    Zumindest ist das die Methode, die zum Rest deines Skripts passt.

    hmm, ich bin ziemlich neu in dem Thema. Kann sein das ich etwas will das so nicht funktioniert.  

     

    Ich habe 3 Dateien in dem Verzeichnis. Und die sollen alle durch die Prüfung und dann wieder in einzelne Dateien zurück.

    C:\Users\Myname\Desktop\Auobearbeitungtest

    Ich bin davon ausgegangen, das mir nur der Code zum Speichern in einzelne Dateien fehlt.

  7. Guten Tag, 

    Ich bin dabei xml Daten aus einem Verzeichnis einzulesen und diese zu bearbeiten.  Jedoch weiß ich nicht und finde nichts wie ich diese einzeln wieder Speicher. 

    $files = Get-ChildItem  C:\Users\Myname\Desktop\Auobearbeitungtest -Recurse *.xml  |
    Foreach-Object {
      [xml]  $content = Get-Content $_.FullName   }
    $NewRawXML=$content|%{
      if ($_ -match '\<BMECAT\s*'){
        $_ -replace '\s*xmlns\=".*"',''   }
      else{
        $_    }}

    Wenn ich die Dateien einzeln einspiele und einzeln wieder ausspiele geht natürlich alles wunderbar. Aber wie mache ich das hier?

    In der Originaldatei oder unter dem Original Namen in einem neuen Verzeichnis wäre supi.  

     

    Danke und liebe Grüße 

  8. Ne, das läuft super. O.o 

     

    ok, so funktioniert es

    -<BMECAT>

    und wie unten nicht.

    -<BMECAT xml:lang="de" xmlns="http://www.bmecat.org/bmecat/2005fd" version="2005">

    das Problem ist der Link. Ich versuche den jetzt direkt am Anfang zu löschen. 

    Soweit ich Richtig verstehe, ist das ein Attribut in dem Element. 

  9. Danke dir:)

    Habe deine xml gerade ausgeführt und dann tuts bei mir auch, aber ich weiß nicht wo der große unterschied zu dieser ist:rolleyes:

    <?xml version="1.0" encoding="UTF-8"?>
    -<BMECAT xml:lang="de" xmlns="http://www.bmecat.org/bmecat/2005fd" version="2005">
     -<T_NEW_CATALOG>
      -<PRODUCT>
       -<PRODUCT_FEATURES>
         <REFERENCE_FEATURE_GROUP_NAME>Test12</REFERENCE_FEATURE_GROUP_NAME> 
        -<FEATURE>
          <FNAME>Marke</FNAME>
          <FVALUE>Test1;Test11</FVALUE>
          <FORDER>10</FORDER>
          <FVALUE_DETAILS>HK204000010</FVALUE_DETAILS>
          <FVALUE xmlns=" ">Test1</FVALUE>
          <FVALUE xmlns=" ">Test11</FVALUE>
         </FEATURE>
        -<FEATURE>
          <FNAME>Hersteller</FNAME>
          <FVALUE>Test2;Test22;Test222</FVALUE>
          <FORDER>20</FORDER>
          <FVALUE_DETAILS>HK204000020</FVALUE_DETAILS>
          <FVALUE xmlns=" ">Test2</FVALUE>
          <FVALUE xmlns=" ">Test22</FVALUE>
          <FVALUE xmlns=" ">Test222</FVALUE>
        </FEATURE>
       </PRODUCT_FEATURES>
      </PRODUCT>
     </T_NEW_CATALOG>
    </BMECAT>

     

  10. Sooo, 

    Am 24.9.2021 um 13:27 schrieb BOfH_666:

    Wenn jetzt aber mit jeder neuen Antwort von Dir, die eigentliche Aufgabe geändert wird, fühle ich mich ehrlich gesagt verars***t und hab keine Lust mehr.  

    Das war mein eigentliches Ziel :aha2:. Ne Spaß, schätze ich muss neben PowerShell auch noch lernen wie man von Anfang an seine Frage komplett & richtig stellt. :rolleyes::lool:

    Am 24.9.2021 um 13:27 schrieb BOfH_666:

    Wenn Du das nicht möchtest, musst Du eine Abfrage einbauen, die entweder prüft, ob ein Semikolon enthalten ist oder ob das Aufspalten am Semikolon mehr als ein Element zurückgeliefert hat. 

    Habe ich hinbekommen. ^^

     

    Am 24.9.2021 um 13:27 schrieb BOfH_666:

    Das xmlns="" ist ein XML-Attribut und sollte meiner Meinung nach standard-konforme Tools nicht stören, wenn es nicht erwartet oder gebraucht wird.

    Dann ist ja gut, kann das einspielen leider nicht selber ausprobieren :/

    Am 24.9.2021 um 13:27 schrieb BOfH_666:

    Wozu? Stört das? Wenn man mit .CreateNode() einen neuen Node erzeugen kann, gibt es bestimmt auch eine Methode, wie man existierende Nodes entfernen kann. ;-)

    Hierzu, habe ich viel ausprobiert uuund komme nicht weiter....:/

     

     $XmlData = [xml](Get-Content -Path 'C:\Users\MeinName\Desktop\DE_nv2040_new.xml')
           
    
     		foreach ($Feature in ($XmlData.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES).FEATURE ) {
    
     $condition = $Feature.FVALUE -match ";"
    
    		
         
    		$nodes = $XmlData.SelectNodes("FVALUE['$condition']")
            foreach($node in $nodes){$node.ParentNode.RemoveChild($node)}    
    }
     }
    		$XmlData.Save('C:\Users\MeinName\Desktop\DE_nv2040_new.xml')

    Als Beispiel nehme ich einfach mal das. Bin aber noch mehr Möglichkeiten durchgegangen, aber nichts tut. meistens bekomme ich die Rückmeldung das der den NULL hat. 

    Heute Morgen, hats zumindest was anderes gelöscht, aber ich weiß nicht mehr wie ich das zusammen gefriemelt hab.

     

  11. Hallo BOfH_666

    ich weiß gar nicht wie ich mich bei dir bedanken soll<3

    <FEATURE>
              <FNAME>Länge</FNAME>
              <FVALUE>900</FVALUE>
              <FORDER>120</FORDER>
              <FVALUE_DETAILS>84241265426</FVALUE_DETAILS>
              <FV xmlns="">900</FV>
            </FEATURE>
    
            <FEATURE>
              <FNAME>Farbe</FNAME>
              <FVALUE>anthrazit;edelstahl</FVALUE>
              <FORDER>200</FORDER>
              <FVALUE_DETAILS>45445256525</FVALUE_DETAILS>
              <FV xmlns="">anthrazit</FV>
              <FV xmlns="">edelstahl</FV>
            </FEATURE>

    das ist das Ergebnis. Ich denke <FV xmlns=""> wird hierdurch erzeugt

     [$child = $XmlData.CreateNode("element", "FV", "")] 

    also müsste ich nur FV durch FVALUE ersetzen und die letzten "" Wegnehmen, dann wäre es richtig angezeigt. 

    Nur wie lösche ich dann das Alte wo noch Semikolons drin sind?

    Das Skript erstellt mir jetzt auch einen <FV xmlns=""> Eintrag für welche ohne ";"    :/

    Und geht das, dass der neue Eintrag dann da steht wo der Alte war/ist?

     

    Alles in allem bin ich dir aber so ohnehin schon <Unendlich>%</Unendlich> dankbar und wenn du an dieser Stelle genug hast. Ist das kein Problem für mich. <3

     

  12. Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In Zeile:6 Zeichen:5
    +     $XmlData.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES.FEATURE.Ap ...
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Hi, also erstmal danke ich dir vielmals.

    Ich werde E-Commerce Kaufmann. Also an sich habe ich gar nicht so viel mir Programmieren zu tun:)

     

    Ich bekomme diese Fehlermeldung, wenn ich das Skript ausführe. 

     

     

  13. Also erstmal danke das Ihr so viel Nachsicht mit mir habt ^^ 

     

    $XmlData = [xml](Get-Content C:\Users\MeinName\Desktop\DE_nv2040.xml)
    
    #$xmlData.GetType()
    
    $XmlData.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES.FEATURE.FVALUE
    ForEach-Object (FVALUE in $XmlData) 
    {
       
               if (FVALUE -like '*;*')
                
     
            
     }

     

    Soooo, also ich bin soweit gekommen das ich mir FVALUE Inhalte ausgeben kann. 

     

    Jetzt fehlt ja noch das ForEach Object/FVALUE mit Semikolon im Inhalt -->Semikolon Löschen, und Inhalte auf neue Nodes aufteilen. Soweit ich das jetzt richtig begriffen habe. 

    Da häng ich gerade n bisschen fest.   

  14. eRROR.PNG.984d5b6662c74b31c4dcafc5fc418030.PNG

     

    Das ist der einzige Code den ich habe O.o 

     

    @echo off
    chcp 65001 >nul
    
    set "XMLFile=DE_nv2045"
    set "outFile=new.%XMLFile%"
      
    (call ) >"%outFile%"
      
    for "tokens=1* delims=]" %%a in ('type "%XMLFile%"^|find /v /n ""') do (
       
      echo %%b|find /i "<FVALUE>" && (
       
        for /f "tokens=1* delims=;" %%f in ("%%b") do (
            
          >>"%outFile%" echo %%f^</FVALUE^>
          
          >>"%outFile%" echo ^<FVALUE^>%%g
        )
      ) || (
        
        >>"%outFile%" echo:%%b
      )
    )
    
    echo 
    type "%outFile%"
    pause

     

×
×
  • Neu erstellen...