Jump to content

Xml datei mit Batch bearbeiten


Go to solution Solved by Proll012,

Recommended Posts

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 to post
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 to post

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 to post

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 to post
  • Solution
Posted (edited)

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. 

Edited by Proll012
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...