Jump to content

Xml datei mit Batch bearbeiten


Direkt zur Lösung Gelöst von Proll012,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Du machst es Dir und anderen gern schwerer als nötig, oder?  Wenn es sich um so ein kurzes Skript handelt, poste am Besten das ganze Skript - nicht nur einen Teil. Und es wäre nett, wenn Du nicht ganz so viel White-Space postest - das macht den Code schwerer lesbar.

 

Wenn Du innerhalb der Schleife einen Node identifiziert hast, der aufgeteilt werden soll - Du also bereits an der Stelle bist, die Du nach dem Aufsplitten entfernen möchtest - solltest Du genau diesen Node auswählen - nicht pauschal alle Nodes!! ;-)  Also nicht .SelectNodes() auf alle Nodes FVALUE sondern nur den einen, den Du grad bearbeitest!!

 

Input:

<?xml version="1.0" encoding="UTF-8"?>
<BMECAT>
    <T_NEW_CATALOG>
        <PRODUCT mode="new">
            <PRODUCT_FEATURES>
                <FEATURE>
                    <FNAME></FNAME>
                    <FVALUE>XYZ; 52; green </FVALUE>
                    <FORDER></FORDER>
                </FEATURE>
                <FEATURE>
                    <FNAME></FNAME>
                    <FVALUE>XYZ; 53; blue </FVALUE>
                    <FORDER></FORDER>
                </FEATURE>
                <FEATURE>
                    <FNAME></FNAME>
                    <FVALUE>Bla keks ohne semikolon</FVALUE>
                    <FORDER></FORDER>
                </FEATURE>
            </PRODUCT_FEATURES>
        </PRODUCT>
    </T_NEW_CATALOG>
</BMECAT>

 

Code:

 

$XmlData = [xml](Get-Content -Path 'C:\Users\MeinName\Desktop\DE_nv2040.xml')

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", "FV", "")
            $child.InnerText = $Value
            $Feature.AppendChild($child)
        }
        $ItemToRemove = $Feature.SelectSingleNode('FVALUE')
        $Feature.RemoveChild($ItemToRemove)
    }
}
$XmlData.Save('C:\Users\MeinName\Desktop\DE_nv2040_new.xml')

 

Output:

 

<?xml version="1.0" encoding="UTF-8"?>
<BMECAT>
  <T_NEW_CATALOG>
    <PRODUCT mode="new">
      <PRODUCT_FEATURES>
        <FEATURE>
          <FNAME>
          </FNAME>
          <FORDER>
          </FORDER>
          <FV>XYZ</FV>
          <FV>52</FV>
          <FV>green</FV>
        </FEATURE>
        <FEATURE>
          <FNAME>
          </FNAME>
          <FORDER>
          </FORDER>
          <FV>XYZ</FV>
          <FV>53</FV>
          <FV>blue</FV>
        </FEATURE>
        <FEATURE>
          <FNAME>
          </FNAME>
          <FVALUE>Bla keks ohne semikolon</FVALUE>
          <FORDER>
          </FORDER>
        </FEATURE>
      </PRODUCT_FEATURES>
    </PRODUCT>
  </T_NEW_CATALOG>
</BMECAT>

 

Link zu diesem Kommentar
vor 28 Minuten schrieb Proll012:

Wenn ich das ausführe kommt eine Fehlermeldung: 

 

[Ausnahme beim Aufrufen von "RemoveChild" mit 1 Argument(en):  "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."]:eye2:

 

Tja .. .was soll ich dazu sagen ... ich hab's grad nochmal getestet - sowohl mit PS v5.1 als  auch mit v7.1.4. Und was soll ich sagen - es funktioniert mit den Daten, die ich gepostet habe genau so wie ich es gepostet habe.

Link zu diesem Kommentar

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>

 

Link zu diesem Kommentar

Wenn ich das als XML-Datei speichere und versuche zu importieren, bekomme ich schon eine Fehlermeldung - Du nicht? PowerShell hält das nicht für valides XML.

 

v7.1.4 :

InvalidArgument: Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type."

 

v5.1

Der Wert "System.Object[]" kann nicht in den Typ "System.Xml.XmlDocument" konvertiert werden. Fehler: "Der angegebene Knoten konnte nicht als gültiger untergeordneter Knoten eingefügt werden, da der angegebene Knoten den 
falschen Typ hat."
In Zeile:1 Zeichen:1
+ $XmlData = [xml](Get-Content -Path 'D:\sample\DE_nv2040_orig.xml')   
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument

 

Link zu diesem Kommentar
  • Beste Lösung

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. 

bearbeitet von Proll012
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...