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

Geschrieben

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>

 

Geschrieben
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.

Geschrieben

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>

 

Geschrieben

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

 

  • Beste Lösung
Geschrieben (bearbeitet)

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
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...