carstencs: XML Datei mit dtd und verschiedenen Namensräumen

https://forum.selfhtml.org/self/2021/feb/19/neueinstieg-programmieren/1784623#m1784623

Hallo

Ich habe mich jetzt wieder für Eclipse entschieden und doch wieder auf XML und XSLT und PHP zu setzen.

ich lese gerade die xml Kapitel in der selfhtml Wiki nach und habe aber für folgendes Grundkonstrukt nichts Richtiges gefunden. Außerdem gibt der Editor in Eclipse einen Fehler an, den ich nicht verstehe. Irgendwie liegt das wohl am root Element?

Ich habe gedacht, dass ich gleich mit verschiedenen Namensräumen anfange, weil so kann ich mich quasi mithilfe dieser xml datei in dem sortieren, was ich vorhab. Ich habe halt gedacht, dass diese xml datei dazu dienen kann grob die Softwarearchitektur, KlassenObjekte und Klassenfunktionen zu definieren. Und mit den Namensräumen könnte ich eine weitere Struktur da reinbringen. Aber ich habe diese Grundkonstruktion nicht hinbekommen.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--

To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
<!DOCTYPE Dateiname  SYSTEM "../dtd/Dateiname.dtd">

-->

<!DOCTYPE Dateiname [

  <!ELEMENT Dateiname  (Datenbank:Datenbankname)>
  	<!ELEMENT Datenbank:Datenbankname (#PCDATA)>
]>


<Dateiname 

xmlns:Datenbank="http://localhost/XML/Datenbank" 
xmlns:Logik="http://localhost/XML/Logik"
xmlns:Stylesheet="http://localhost/XML/Logik">
  
 <Datenbank:Datenbankname></Datenbank:Datenbankname>
      
</Dateiname>

Fehlermeldung:
Attribute "xmlns:Datenbank" must be declared for element type "Dateiname".
Attribute "xmlns:Logik" must be declared for element type "Dateiname".
Attribute "xmlns:Stylesheet" must be declared for element type "Dateiname".

leider kann man die Fehlermeldungen aus dem Eclipse Editor nicht direkt hierher kopieren. Irgendwie verlangt der Editor dass man das Element Dateiname noch einmal deklarieren soll. Was soll denn da jetzteigentlich in diese Ordner reinkommen ? Die dtds? Oder ist das eher dafür da wenn man z.B. mit PHP in der XML datei mit Xpath Elemente ansteuern will und der Link ist ohne Funktion ?

Aber theoretisch so wie ich das ja vorhabe müßte ich ja auch in einer dtd auch die Abhängigkeiten zwischen den Namensräumen definieren, was ich ok fände. Also würde man wenn das so funktionieren würde nur eine dtd benötigen und ich finde das auch ok, dass die dtd in diesem Entwicklungszustand in der xml datei selbst wäre, weil der Eclipse Editor auch bei einer externen dtd ja nur sehr rudimentär zu sein scheint.

  1. oder muß ich die Namensräume nocheinmal explizit in der Dtd durch z.B. eine Notation declarieren ?

    wie würde sowas aussehen ?

    muß ich eigentlich dieses root Element doppelt deklarieren ?

    also wenn ich das Element aus der dtd rausmache .. kommt auch eine Fehlermeldung ?

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!--
    
    To change this license header, choose License Headers in Project Properties.
    To change this template file, choose Tools | Templates
    and open the template in the editor.
    <!DOCTYPE Dateiname  SYSTEM "../dtd/Dateiname.dtd">
    
    -->
    
    <!DOCTYPE Dateiname [
    
     <!ELEMENT Datenbank:Datenbankname (#PCDATA)>
    ]>
    
    
    <Dateiname 
    xmlns:Datenbank="http://localhost/XML/Datenbank" 
    xmlns:Logik="http://localhost/XML/Logik"
    xmlns:Stylesheet="http://localhost/XML/Stylesheet">
      
     <Datenbank:Datenbankname></Datenbank:Datenbankname>
          
    </Dateiname>Quelltext hier
    
    
    Error: Element type "Dateiname" must be declared.
    
    1. ok hier ist glaube ich die Lösung .. aber vielleicht hat ja jemand trotzdem ein Feedback

      <!DOCTYPE Dateiname [
      
        	<!ELEMENT 	Dateiname  			(Datenbank:Datenbankname)>
      	<!ATTLIST 	Dateiname 			xmlns:Datenbank 	CDATA #FIXED 	"http://localhost/XML/Datenbank"
      									xmlns:Logik			CDATA #FIXED 	"http://localhost/XML/Logik" 
      									xmlns:Stylesheet	CDATA #FIXED 	"http://localhost/XML/Style" 
      	>
        	<!ELEMENT 	Datenbank:Datenbankname 			(#PCDATA)>
      
        
      
      ]>
      
      
      <Dateiname
      xmlns:Datenbank="http://localhost/XML/Datenbank" 
      xmlns:Logik="http://localhost/XML/Logik" 
      xmlns:Stylesheet="http://localhost/XML/Style" >
      
      
        
       <Datenbank:Datenbankname></Datenbank:Datenbankname>
            
      </Dateiname>Quelltext hier
      

      ich habe das mithilfe von diesem Artikel gelöst .. allerdings findet man den nur über google und nicht über das xml Kapitel in der selfhtml wiki

      https://wiki.selfhtml.org/wiki/XML/Regeln/Namensr%C3%A4ume_und_Validierung

  2. Ich habe mich jetzt wieder für Eclipse entschieden und doch wieder auf XML und >XSLT und PHP zu setzen.

    vielleicht werde ich jetzt doch NetBeam benutzen, weil dort der XML Editor besser zu funktionieren scheint. Wenn man dort einen Knoten eingeben will, der in der dtd steht, werden dort alle möglichen Knoten, die in der dtd stehen angezeigt bzw. vervollständigt.

    Kann man eigentlich in Netbeam die Schriftgröße verändern, wenn man mit 2 Bildschirmen arbeitet? Wenn ich das in Windows mache, passt die vergrößerte Schrift in manche PopUpfenster nicht rein .. In Eclipse übrigens auch nicht und auch in vielen anderen Programmen auch nicht ..

    1. Hallo carstencs,

      bei XML bin ich raus.

      Bei Netbeans (nicht Netbeam 😉) habe ich noch die 8.2 auf meinem Computer. Wie gesagt, länger nicht verwendet. Aber da gibt's im Tools Menü die Options, dort gibt's "Fonts & Colors", und da kann ich den generellen Font verstellen.

      Oder meinst Du die Fonts in der Projektmappe? Die werden wohl an den generellen Fonteinstellungen von Windows hängen; dafür finde ich in meiner Version nichts. Microsoft hat das leider heruntergedummt, man kann die Menüs nur noch ändern, wenn man an den globalen Texteinstellungen herummacht (öffne das Startmenü und tipp "Auflösung" ein).

      Rolf

      --
      sumpsi - posui - obstruxi
      1. schade das Du bei XML raus bist ...

        ich habe glaube jetzt eine Lösung für mein Bildschirmproblem gefunden...

        ich habe den großen Bildschirm als Hauptbildschirm umgestellt und den Laptopbildschirm als 2. Bildschirm. jetzt wird halt von 125% auf 100% runterskaliert. Ich hoffe dass nun die Popupfenster eher zu groß sein werden ..

        Blöd ist das jetzt nur mit den Symbolen auf dem Desktop ... die kann man jetzt nicht mehr sortieren , weil die sich beim Bildschirmwechsel immer verändern ..

        ....

        ist xml nicht der universal skalierbare opensource Ansatz und Universalsprache überhaupt ?... ich find das echt gut ...

        ich überlege mir gerade wie ich Webservices einrichten werde. Im ersten Augenblick habe ich natürlich gedacht mit PHP ... oder gibt es sowas auch in XSL oder HTML5 ? Aber da wirds dann wahrscheinlich auch viele Sicherheitsprobleme geben? .. oder gibts bei HTML5 auch so spezielle Loginsachen ?

        1. Hallo carstencs,

          Webservices in HTML gibt es nicht. Wie? HTML ist keine Programmiersprache, sondern eine statische Auszeichnugssprache.

          Webservices benötigen eine aktive Komponente, die HTTP spricht. HTTP, nicht HTML, das sind verschiedene Dinge. Das kann ein Webserver sein, der Scripte startet oder der Module integriert hat, die ausführbaren Code bereitstellen (z.B. JSP oder ASP.NET). Das kann Node.js sein, der JavaScript ausführt und eine HTTP Library mitbringt. Oder ein C++ Programm, das ganz allein zu den Sockets läuft und den Port 80 öffnen.

          Und diese aktive Komponente muss dann im Stande sein, ein für Webservices geeignetes Protokoll zu verstehen. HTTP-Verben für REST Services. Spezielle XML-Datenpakete für SOAP. Das Thema der Authentication kann man auf HTTP Ebene lösen, dann kümmert sich der Webserver drum. Oder man löst es auf Protokoll-Ebene, dann muss es die Anwendung (oder eine Middleware) tun.

          Die Fragen nach HTML und Security ist dagegen irregeleitet, wenn es um Webservices geht. Mit HTML werden Webservices weder konsumiert noch produziert. Bestenfalls kann ein Script in einer HTML Seite einen Service konsumieren.

          Kann man Webservices mit XSL bauen? Tja. Kannst Du Straßen für U-Boote bauen? Oder einen Haus trinken? Eine Frage springen? Das sind ähnlich sinnvolle Tätigkeiten. Meiner Meinung nach. Sie wollen Dinge verbinden, die miteinander nichts zu tun haben. Man KANN sicherlich einen Webservice schreiben, der zur Ausübung seiner Tätigkeit XSL verwendet. Aber dann ist XSL ein dafür genutztes Werkzeug. Der Webservice an sich wird anders gebaut. Mit PHP, mit JS, mit Java, C#, C++, Perl, wasauchimmer.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf B,

            Tja. Kannst Du Straßen für U-Boote bauen? Oder einen Haus trinken? Eine Frage springen?

            Ich weiß, wo dein Bett schläft.

            Bis demnächst
            Matthias

            --
            Du kannst das Projekt SELFHTML unterstützen,
            indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          2. bei der Middleware war ich glaube ich einmal ...

            wie würde man denn eine Authentifizierung über den Browser in HTTP realisieren?

            Kann man eigentlich auch mit PHP auf der Socketebene Port 80 verwenden? ..

            sag mal so wie ich das jetzt verstanden habe würde eine Middleware die Protokolle ersetzen, weil ja die Logik auf dem Server ist und in der Software dort ... aber wahrscheinlich würde dann die komplette Internetseite neugeladen werden.

            aber wozu braucht man dann die Protokolle ? Dienen die dazu dass man dann ganze XML oder XSL .. Teilstücke der aufgerufenen Webseite ersetzen kann ...?

            aber vom Wissen her ..das Gesagte existiert gerade mental nur als Vision bei mir ...

            Was halt irgendwie ein unschlagbares Argument für Flash und Air war , war doch, dass alles Runtergeladene weiterbestehen könnte .. also bei Air .. das man nicht jedesmal alles wieder erneut herunterladen müßte ..

            geht sowas eigentlich rein auf XML und XSL Basis oder braucht man dort js? oder kommen da diese Protocolle zum Einsatz ?

            1. Hallo carstencs,

              wie würde man denn eine Authentifizierung über den Browser in HTTP realisieren?

              Gar nicht. Das machen Browser und Webserver miteinander aus. Wenn Du einen Webservice via HTTP authentifizierst, verwendest Du - mutmaßlich - XMLHttpRequest oder das fetch-API und die erledigen das im JavaScript für Dich. Die Serverseite wird vom Webserver versorgt.

              Wenn Du keinen Webserver verwendest, sondern den Server selbst schreibst, lies Dir RFC 2617 durch, und die Folge-RFCs, die ihn erweitern und erneuern (steht im 2617 im Kopf). Da ist HTTP Authentication beschrieben. (Jedi-Handbewegung) „Das ist nicht das, was Du programmieren willst“.

              Aber mit PHP schreibst Du den Server normalerweise nicht selbst. PHP wird vom Server aufgerufen, um den Teil zu steuern, der über HTTP hinaus geht.

              Kann man eigentlich auch mit PHP auf der Socketebene Port 80 verwenden? ..

              Ich schrieb oben "normalerweise". Aber ja, du kannst PHP als normalen Prozess starten, ohne Webserver, und dich dann nach Herzenslust an Socket 80 binden und ihn belauschen. Wenn denn kein Webserver läuft, der bereits lauscht.. Dann geht's nicht. Sockets sind eigensinnig, die wollen nur einem was ins Öhrchen flüstern[1]. Aber warum mit PHP einen HTTP Server schreiben? (Jedi-Handbewegung) „Das ist nicht das, was Du programmieren willst“.

              Als Client ist es was anderes, du kannst jederzeit von PHP aus eine HTTP-Verbindung zum Port 80 von anderen Servern öffnen. Es ist aber mühsam, das low-level zu tun. (Jedi-Handbewegung) „Das ist nicht das, was Du programmieren willst“. Besser verwendet man fertige Funktionen, die bestimmte Aufgaben komplett erledigen, z.B. file_get_contents, der kannst Du eine http-URL geben und sie lädt die Datei dahinter eben mal runter.

              Middleware ... aber wahrscheinlich würde dann die komplette Internetseite neugeladen werden.

              Du vermischst Erdäpfel mit Pferdeäpfeln. Wenn Du mit dem JavaScript einer Webseite einen Webservice aufrufst, hat das mit dem Neuladen der Seite nichts zu tun. Mit Middleware habe ich - beispielsweise - eine Library für PHP gemeint, die Dir die Tiefen des SOAP-Protokolls abnimmt, wenn Du denn einen SOAP-Service schreiben willst. Ich habe bisher SOAP immer nur zusammen mit HTTP-Authentication verwendet, aber ich meine, es gibt auch SOAP-Standards für eine eigene Authentication. Da habe ich aber kein eigenes Wissen mehr. Was ich bei SOAP weiß, ist, dass da komplexe XML-Pakete hin- und hergeschickt werden, die spezifizieren, welche Aufgabe der Server ausführen soll. Eine SOAP-Middleware versteht diese Pakete und routet die Aufträge des Clients - beispielsweise - an Methoden einer Klasse. Diese Methoden erzeugen dann als Ergebnis Objekte, die die an die Middleware zurückgeben. Die verpackt sie wieder in XML und schickt sie zum Aufrufer zurück. Das ist aber was ganz anderes als ein HTML, dass Du mittels XLST aus einem XML Dokument erzeugst.

              Die Seite wird nur dann neu geladen, wenn Du im HTML einen Link anklickst, ein Form abschickst oder via JavaScript die location änderst.

              Rolf

              --
              sumpsi - posui - obstruxi

              1. (räusper) Eigentlich. Unter Windows gibt's die HTTP.SYS Library, die es ermöglicht, dass Prozesse sich HTTP Sockets teilen, sofern sie auf unterschiedliche URLs lauschen. Aber das ist letztlich ein Fake, weil es auch da nur einen Lauscher gibt: HTTP.SYS. Die Lib verteilt die Pakete dann je nach der URL, die die Clients anfordern. keine Ahnung ob PHP das unterstützt oder ob es dazu ein Äquivalent unter Linux gibt. ↩︎

              1. mit anderen Worten auf dem Socket bzw. Port 80 wo jeder mitlauschen kann, werden nur Tans ? oder ähnliche Sachen ausgetauscht, die dann auf dem Webserver Ihre geheimen Middleware Transaktionen ausführen , weil dort dann der Code ist.

                letztendlich ist so eine XMl datei ja nicht besonders groß und irgendwelche Informationen müssen ja jedesmal zwischen Client und Server transportiert werden .. und die Stylesheets im XSL und XSLT Format werden sicherlich wie die Images im Browser Cache gespeichert ...

                Aber viel Leute fahren wahrscheinlich mehrgleisig und die HTTP Authentifizierung ist wahrscheinlcih ein Teil davon ... aber die funktioniert wirklich nur mit JS?..oder kann man über PHP direkt die Browserdaten upchecken und da eine Authentifizierung gewährleisten ..?

                aber darüber hinaus denke ich, dass wenn man etwas Sicheres machen möchte, man grundsätzlich auf fremde KLassen etc verzichten sollte..oder ?

                Mein Sicherheitskonzept wäre halt, dass ich für jeden Button eine verschlüsselte URL tangleich ausgeben würde, die an einen User und einen Login und einen Browser und einen Computer gebunden ist ..

                da könnte man ja auch die Browser HTTP Sachen miteinbauen ..

                1. aber gibt es nicht auch sowas direkt vom Browser, dass er sandboxmäßig überprüft , ob man immer mitdemselben Server zu tun hat ?.. also nach meiner Erinnerung gab es sowas bei Flash und Air ..

                  man könnte ja sagen, dass das einen selber nichts angeht, sondern nur den Clienten , aber trotzdem wenn man das dann über den Server bzw. PHP ermitteln könnte, dass es da Sandboxverletzungen gegeben haben könnte ?

                  Schon interessant wie so etwas gelöst werden könnte .. aber dazu bräuchte man eben noch eine 2. Verbindung zum ursprünglichen Computer .. oder ?

                  1. Hallo carstencs,

                    wenn du das Thema "same-origin policy" meinst, ja, schon. Von Javascript ausgelöste HTTP Requests dürfen per Default nur an den gleichen Server gehen. Es gibt ein komplexes Regelwerk, mit Headern gesteuert, um das zu erweitern. Aber darauf möchte ich hier nicht eingehen, das habe ich nämlich selbst nicht wirklich verstanden.

                    Was ich eigentlich nachtragen wollte, war ein Punkt zur Authentifizierung im Zusammenhang mit PHP. Man kann einerseits den Webserver so einstellen, dass er eine HTTP Authentication verlangt. Andererseits kann man das, wenn es nur unter bestimmten Umständen erfolgen soll, auch von PHP aus auslösen. Das steht hier beschrieben.

                    Rolf

                    --
                    sumpsi - posui - obstruxi