none
XML - Filtern RRS feed

  • 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
    Donnerstag, 4. Mai 2017 17:10

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
    Montag, 8. Mai 2017 20:01

Alle Antworten

  • Hallo Oliver,

    zum Überführen von einem xml Format in ein anderes würde ich ein Stylesheet xslt verwenden.


    - Gruß Florian

    Freitag, 5. Mai 2017 07:34
  • Hallo Florian,
    ja das ist ein guter Ansatz.
    Dann müsste das wie folgt aussehen.Ansatz
    Bleibt die Frage offen, kennst Du evtl. ein gutes Beispielprojekt, Tutorial?
    Vielen Dank für einen weiteren Tipp.

    Gruß, Oliver

    Freitag, 5. Mai 2017 15:47
  • 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



    Samstag, 6. Mai 2017 05:00
  • 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

    Samstag, 6. Mai 2017 11:13
  • 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



    Samstag, 6. Mai 2017 11:22

  • 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
    Samstag, 6. Mai 2017 12:14
  • 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

    Samstag, 6. Mai 2017 17:31
  • Hallo Peter,

    händisch meine ohne Wizard, einfach tippen;-)

    Es könnte ja sein, dass man einen Wizard hat, wo man die Elemente auswählen kann.

    Viele Grüße Oliver

    Sonntag, 7. Mai 2017 14:43
  • 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
    Montag, 8. Mai 2017 07:17
  • 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

    Montag, 8. Mai 2017 16:54
  • 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
    Montag, 8. Mai 2017 20:01