Benutzer mit den meisten Antworten
XML - Filtern

Frage
-
Hallo Zusammen,mein Ziel.
Ich lade deserialisiere eine XML Datei.
<setting> <id>set1</id> <value>80</value> <label>EVersion</label> <type>Val</type> <format>R</format> <bits> <addr>0</addr> <startBit>0</startBit> <bitWidth>8</bitWidth> </bits> </setting> <setting> <id>set3</id> <value>50</value> <label>GVersion</label> <type>Bin</type> <format>R</format> <bits> <addr>0</addr> <startBit>0</startBit> <bitWidth>8</bitWidth> </bits> </setting>
Anschließend speichere ich die Datei, mit dem Ziel von gefilterten Elementen.
<setting> <id>set1</id> <value>80</value> </setting> <setting> <id>set3</id> <value>50</value> </Setting>
Fragen:
Wie macht man das geschickt?
Idee
Ich lade, teste gegen eine Schema Datei, serialisiere es
und ich habe das was ich brauche.
Benötigt jemand mehr oder weniger, füge ich eine neue Schemadatei hinzu.
Geht so was, wenn ja, wie?
Grüße, Oliver
Antworten
-
Hi Oliver,
ein Attribut wird mit dem Klammeraffen (@) adressiert. Der Wertevergleich wird dann in eckige Klammern eingeschlossen, z.B. zu Deinem Beispiel so:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:apply-templates select="node()|@*"/> </xsl:template> <xsl:template match="VARIABLES"> <xsl:copy-of select="VARIABLE[@DEPENDENCY = 2012]" /> </xsl:template> </xsl:stylesheet>
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Peter Fleischer Montag, 8. Mai 2017 20:02
- Als Antwort markiert O. Stippe Dienstag, 9. Mai 2017 17:00
Alle Antworten
-
Hi Oliver,
hier mal eine Demo:Methode:
using System; using System.IO; using System.Xml.Xsl; ... internal void Execute() { XslCompiledTransform t = new XslCompiledTransform(); t.Load("Program02.xslt"); t.Transform("Program02Inp.xml", "Program02Out.xml"); using (StreamReader rdr = File.OpenText("Program02Out.xml")) { while (!rdr.EndOfStream) Console.Out.WriteLine(rdr.ReadLine()); } }
Dazu ein mögliches XSLT:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="setting"> <xsl:copy> <xsl:apply-templates select="id | value"/> </xsl:copy> </xsl:template> <xsl:template match="id">
<id>
<xsl:apply-templates/>
</id>
</xsl:template><xsl:template match="value">
<value>
<xsl:apply-templates/>
</value>
</xsl:template></xsl:stylesheet>
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Samstag, 6. Mai 2017 11:25 Fehlerkorrektur
-
Hallo Peter,
ja super und Danke.
t.Transform("Program02Inp.xml", "Program02Out.xml"); using (StreamReader rdr = File.OpenText("Program02Out.xml"))
Hier müsste ich als Input mein XML String eingeben.Da tue ich mir noch schwer.
Input.
<setting> <id>set3</id> <value>50</value> <label>GVersion</label> <type>Bin</type> <format>R</format> <bits> <addr>0</addr> <startBit>0</startBit> <bitWidth>8</bitWidth> </bits>
Jetzt will ich nur
<setting> <label>GVersion</label> <type>Bin</type> <bits> <bitWidth>8</bitWidth> </bits>
das so haben. Wie sieht das Stylesheet dann aus?
Gibt es da evtl. noch Hilfswerkzeuge?
Vielleicht hast noch einen Tipp.
Grüße, Oliver
- Als Antwort vorgeschlagen Peter Fleischer Dienstag, 9. Mai 2017 12:06
- Nicht als Antwort vorgeschlagen Peter Fleischer Dienstag, 9. Mai 2017 12:06
- Als Antwort vorgeschlagen Peter Fleischer Dienstag, 9. Mai 2017 12:07
- Nicht als Antwort vorgeschlagen Peter Fleischer Dienstag, 9. Mai 2017 12:07
-
Hi Oliver,
das XSLT könnte so aussehen:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="setting"> <xsl:copy> <xsl:apply-templates select="label | type | bits"/> </xsl:copy> </xsl:template> <xsl:template match="bits"> <xsl:copy> <xsl:apply-templates select="bitWidth"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Das using war nur zur Anzeige und Kontrolle gedacht.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Dienstag, 9. Mai 2017 12:08 Vereinfachung
-
das XSLT könnte so aussehen:
Hallo Peter,
ok. das hast Du händisch gemacht oder über einen Art Wizard und selektiert, was Du willst.
Bei einfachen XLST sicher ok. Will's nur wissen, wie die korrekte Vorgehensweise ist.
Grüße Oliver
- Bearbeitet O. Stippe Samstag, 6. Mai 2017 12:15
-
Hi Oliver,
was heißt "händisch"? Ich habe eine Konsolenanwendung geschrieben (mit dem t.Transform...), dann Dein XML als XML-Datei hinzugefügt und ein XSLT geschrieben. Das ist für mich die korrekte Vorgehensweise: Aufgabenstellung, Lösungsvarianten, Bewertungskriterien, Auswahl entsprechend Bewertungskriterien.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hallo Oliver,
ja, das wäre ein möglicher Ansatz (Einlesen, Transform anwenden, Ergebnis wegschreiben). Für xslt 1.0 macht dir die Tranformation auch jeder aktuelle Webbrowser (bzw. auch das Webbrowser Control), es reicht dann im XML das xslt anzugeben. Du könntest auch jeden Anwender sein xslt auswählen lassen, so dass dieser eigene angeben kann oder aus einer Auswahl von Darstellungsvarianten wählt.
Zum Testen deines Stylesheets gibt es neben der IDE (Visual Studio) auch div. Webseiten (z.B. http://xslttest.appspot.com)
Zahlreiche Tutorials und eine Einführung in XSLT findest du bei w3schools XSLT Introduction. Das wird auch helfen Peters Beispiel nachzuvollziehen.
Ich gebe keinen weiteren Lösungsvorsschlag für das XSLT an, da dein Fall noch recht einfach ist und eine gute Übung ist, um ins Schreiben von Stylesheets reinzukommen.
- Gruß Florian
- Bearbeitet Florian Haupt Dienstag, 9. Mai 2017 07:18 Füllworte entfernt
-
Hallo,
wenn es überschaubar ist, geht es noch.
Wenn's komplizierter wird, dachte ich halt an einen Wizard.Ich glaube so schwer ist es gar nicht.
Vom Prinzip tut es ja auch, will halt eine Art 'Maske' haben, erstellen, welche Werte (Elemente, Attribute) ich möchte.Wenn ich eine Hierarchie habe.
Also wie selektiere ich das korrekt? Mit \ROOT\GROUP\ASSEMBLY\POSITION\ ?// Hier ist Elementknoten // selektiere ich die unteren Elemente -> OK // Wenn ich aber jetzt noch gezielt Attribute haben möchte, was ist da dann zu tun? // Wie gebe ich das im XLST Sheet vor? Kannst Du mir da bitte noch 2 oder 3 Beispiele geben. <xsl:template match="POSITION"> <xsl:copy> <value> <xsl:apply-templates select="LABEL | NUMBER | INDEX"/> <!--<xsl:attribute name="value" /> not work --> </value> </xsl:copy> </xsl:template> <ROOT> <GROUP> <NAME value="spare parts list" /> <ASSEMBLY> <POSITION> <NAME>Screw M8</NAME> <LABEL value="Brake" /> <NUMBER value="1" /> <INDEX value="1" /> <POSITIONRESULT> <VARIABLES> <VARIABLE DEPENDENCY="2012" TYPE="Audi" /> <VARIABLE DEPENDENCY="2016" TYPE="VW" /> </VARIABLES> <ACTIVE value="1" /> <BAD value="0" /> </POSITIONRESULT> </POSITION>
Wenn ich nur das Element
<VARIABLE DEPENDENCY="2016" TYPE="VW" />
haben möchte. Wie selektiere ich das?
Wäre echt nett von Euch.
Den Rest sollte ich dann alleine hinbekommen.
Gruß, Oliver
-
Hi Oliver,
ein Attribut wird mit dem Klammeraffen (@) adressiert. Der Wertevergleich wird dann in eckige Klammern eingeschlossen, z.B. zu Deinem Beispiel so:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:apply-templates select="node()|@*"/> </xsl:template> <xsl:template match="VARIABLES"> <xsl:copy-of select="VARIABLE[@DEPENDENCY = 2012]" /> </xsl:template> </xsl:stylesheet>
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Peter Fleischer Montag, 8. Mai 2017 20:02
- Als Antwort markiert O. Stippe Dienstag, 9. Mai 2017 17:00