Hallo,
ich stand vor dem gleichen Problem und habe es folgendermaßen gelöst:
Nach dem Erstellen der XML Datei, wird diese Datei mit einer Funktion bereinigt.
Ich habe eine ganze Weile gebraucht, um eine passende XPath Expression zu finden. (Der String hinter SelectNodes). Denn ich wollte auch Knoten mit leeren Attributen entfernen. Da die ParentNodes mit einem Absatz stehen bleiben, war "normalize-space" die Lösung. Dazu kann ich auch den folgenden Onlinetester für XPath Expressions empfehlen:
https://www.freeformatter.com/xpath-tester.htmlEs werden also alle Knoten ausgewählt die keinen Inhalt haben. Damit Knoten ohne Inhalt, aber mit einem gefüllten Attribut nicht gelöscht werden, wird nochmal die gleiche Teilexpression mit (@*) verwendet.
Variablen:
- Code: Alles auswählen
Name DataType Subtype Length
XMLDocument DotNet System.Xml.XmlDocument.'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
XMLNode DotNet System.Xml.XmlNode.'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
XMLNodeList DotNet System.Xml.XmlNodeList.'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
i Integer
Funktion:
- Code: Alles auswählen
RemoveEmptyNodes(TempServerFile : Text)
XMLDocument := XMLDocument.XmlDocument();
XMLDocument.Load(TempServerFile);
XmlNodeList := XMLDocument.SelectNodes('//*[not(string-length(normalize-space())) and not(string-length(normalize-space(@*)))]');
for i := XmlNodeList.Count - 1 downto 0 do begin
XmlNode := XmlNodeList.Item(i);
XmlNode.ParentNode.RemoveChild(XmlNode);
end;
XMLDocument.Save(TempServerFile);
Meine XML Datei ist so von 61Kb auf 6Kb geschrumpft
Beispiel (stark eingekĂĽrzt):
XML Alt
- Code: Alles auswählen
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<ORDERS05>
<IDOC BEGIN="">
<EDI_DC40 SEGMENT="">
<TABNAM>EDI_DC40</TABNAM>
<MANDT />
<DOCNUM>123456789</DOCNUM>
<DOCREL />
</EDI_DC40>
<E1EDK01 SEGMENT="">
<ACTION />
<KZABS />
</E1EDK01>
<E1EDK14 SEGMENT="nicht löschen">
<QUALF />
<ORGID />
</E1EDK14>
</IDOC>
</ORDERS05>
XML Neu:
- Code: Alles auswählen
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<ORDERS05>
<IDOC BEGIN="">
<EDI_DC40 SEGMENT="">
<TABNAM>EDI_DC40</TABNAM>
<DOCNUM>123456789</DOCNUM>
</EDI_DC40>
<E1EDK14 SEGMENT="nicht löschen">
</E1EDK14>
</IDOC>
</ORDERS05>