Archief - Java: external XML aanroepen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

D3C0Y

Legacy Member
Ik probeer in mijn applet een extern xml bestand aan te roepen om de inhoud te kunnen lezen en gebruiken in mijn applet. Het bestand staat (voorlopig) nog op mijn webspace van telenet (dus mischien ligt het probleem hier), maar wanneer ik probeer in te lezen van het bestand krijg ik altijd errors

dit is console log:
Code:
network: Connecting http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml with proxy=DIRECT
network: Connecting http://users.telenet.be/crossdomain.xml with proxy=DIRECT
network: Connecting http://users.telenet.be:80/ with proxy=DIRECT
network: Connecting http://users.telenet.be/crossdomain.xml with cookie "__utmz=226366239.1223468593.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); st8id_wlf_%2Etelenet%2Ebe_%2F=TE5HVExNX0ZMQVNI?81c37b0684bbf41f4c42c63db814f879; __utma=226366239.605535372.1223468593.1223556298.1224764225.3"
network: Connecting http://www.zita.be/users_error/ with proxy=DIRECT
network: Connecting http://www.zita.be:80/ with proxy=DIRECT
java.security.PrivilegedActionException: java.io.FileNotFoundException: http://www.zita.be/users_error/
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
	at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
	at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
	at sun.net.www.http.HttpClient.openServer(Unknown Source)
	at sun.net.www.http.HttpClient.<init>(Unknown Source)
	at sun.net.www.http.HttpClient.New(Unknown Source)
	at sun.net.www.http.HttpClient.New(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at java.net.URL.openStream(Unknown Source)
	at facebookgame.parsing.XmlParser.SearchXml(XmlParser.java:38)
	at facebookgame.entity.ShotEntity.<init>(ShotEntity.java:62)
	at facebookgame.InGameState.Enter(InGameState.java:75)
	at facebookgame.FacebookApp.changeToState(FacebookApp.java:258)
	at facebookgame.MenuState.CheckPlayerInput(MenuState.java:106)
	at facebookgame.MenuState.StateCycle(MenuState.java:139)
	at facebookgame.FacebookApp.gameLoop(FacebookApp.java:212)
	at facebookgame.FacebookApp.access$200(FacebookApp.java:17)
	at facebookgame.FacebookApp$1.run(FacebookApp.java:60)
Caused by: java.io.FileNotFoundException: http://www.zita.be/users_error/
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at com.sun.deploy.net.CrossDomainXML$2.run(Unknown Source)
	... 22 more

mijn java code is
Code:
public Vector SearchXml(String filename, String typeList, int typeNumber)
    { 
        Vector <Object> parsedList = new Vector();
  
        try 
        {
            // 1. Build the document with SAX and Xerces, no validation
            SAXBuilder builder = new SAXBuilder();
            System.out.println("build SAX");
            
            // 2.Create the document
            InputStream filesource = new URL("http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml").openStream();
            System.out.println("found input source");
            Document doc = builder.build(filesource);
            System.out.println("Created document");
            
            // 3. Create a root Element for fast use
            Element root = doc.getRootElement();
            System.out.println("got rootElement");
  
            // 4. Check all childNodes of root for typeNumber 
            for (int i=0;i<root.getChildren().size();i++)
            {
                // I. cast the current child into a temporary Element
                Element temp = (Element) root.getChildren().get(i);

                // II. if the current child has the right type, push his children back into vector
                if (temp.getAttribute("type").getIntValue() == typeNumber)
                {
                    for (int j=0;j<temp.getChildren().size();j++)
                    {
                        parsedList.set(j, temp.getChildren().get(j));
                    }
                    
                    return parsedList;
                 }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        return null;
    }
}

kheb de URL ff gehardcodet om te kijken of het daar aan lag (normaal gezien wordt de String filename voor de URL gebruikt), maar dat geeft hetzelfde resultaat

iemand een idee wat ik verkeerd doe ?

eniac

Legacy Member
Gewoon een random vraagje: waarom een Vector?
En argh:
- accolades openen op de lijn zelf :p
- methodenamen hebben GEEN hoofdletter. Never ever ever.

Anyway, even de niet-relevante dingen uit je code gehaald en even geprobeerd. Volgende code:

Code:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Vector;


public class XMLHandler {

	public static Vector SearchXml(String filename, String typeList, int typeNumber){ 
        Vector <Object> parsedList = new Vector();
  
        try{
        	InputStream filesource = new URL("http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml").openStream();
            System.out.println("found input source");
            byte[] readIn = new byte[8];
            int bytesRead = filesource.read(readIn);
            OutputStream stream = System.out;
            while(bytesRead != -1){
            	stream.write(readIn);
            	bytesRead = filesource.read(readIn);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        
        return null;
	}
	
	public static void main(String[] args){
		SearchXml("bleh", "bleh", 2);
	}
}

Geeft me volgende output in de console:
Code:
found input source
<?xml version="1.0"?>
<bulletList>
<bullet type="1">
	<speed>1.0f</speed>
	<size>O.65f</size>
	<damage>1</damage>
	<texture>"res/shot.png"</texture>
	<sound>"blah.ogg"</sound>
</bullet>
<bullet type="2">
	<speed>1.5f</speed>
	<size>O.65f</size>
	<damage>1</damage>
	<texture>"res/shot.png"</texture>
	<sound>"blah.ogg"</sound>
</bullet>
</bulletList>

D3C0Y

Legacy Member
mja ik kom van C++ dusja, daar hebben methodenamen altijd hoofdletter :D en het is mij aangeleerd dat een vector efficienter omspringt met geheugengebruik (toch in c++), en dat van die accolades tja ik werk graag overzichtelijk :p

direct is uw code testen + geeft dat problemen in java mss, methodes met een hoofdletter

**

hmm dat van u werkt ook niet, ik krijg niks in mijn console

+ ik gebruikte jdom in mijn eerste code, maar aangezien gij de SaxBuilder & Document hebt weggedaan in uw voorbeeld, nu weet ik niet goed meer wat te doen om de children enzo op te vragen.

KenSpectre

Legacy Member
D3C0Y zei:
en dat van die accolades tja ik werk graag overzichtelijk :p

Ik zet het erachter en bij mij ook overzichtelijk ze :p das maar smaak :)

D3C0Y zei:
geeft dat problemen in java mss, methodes met een hoofdletter

Nee, normaal niet. Das gewoon conventie (of hoe zeggen ze dat? afgesproken dus).
Mensen op school doen ook methods met hoofdletter, een kleine opmerking van de docent is alles wat ze dan krijgen, de programma's werken perfect.

eniac

Legacy Member
D3C0Y zei:
het is mij aangeleerd dat een vector efficienter omspringt met geheugengebruik (toch in c++)

Vergeet dat maar voor Java. Je kunt een Vector zien als een ArrayList die synchronized is. Bijgevolg, als je het synchronized gedrag niet nodig hebt, is het alleen maar trager dan een ArrayList zonder echte voordelen.

In de meeste gevallen ben je dus beter gesteld met een ArrayList :)

geeft dat problemen in java mss, methodes met een hoofdletter

Neen, maar het is 1 van de basisconventies. Als je later werkt ga je daar nog commentaar op krijgen.

ok dat van u werkt, maar nu geraak ik er niet aan uit hoe ik de children etc. van die xml opvraag (ik zou enkel de values in de xml willen, niet het gehele xml bestand met containers)

ik gebruikte jdom in mijn eerste code, maar aangezien gij de SaxBuilder & Document hebt weggedaan in uw voorbeeld, weet ik niet goed meer wat te doen.

Concentreer je niet op wat ik doe: ik wou gewoon snel visuele bevestiging dat ik jouw bestand correct binnenkrijg. De belangrijkste lijn is het aanmaken van je InputStream door openStream() aan te roepen op je URL-object. Bij jouw code (beginpost) werkte dat precies niet, maar dat heb je nu dus wel in gang met mijn code.

Normaal gezien kan je nu gewoon verder met de code uit je beginpost. Probeer na te gaan waarom bij mij die openStream() wel werkt en bij jou oorspronkelijk niet. Mogelijk foute imports?

Parnakra

Legacy Member
In C++ is de conventie toch ook dat methodes met een kleine letter moeten beginnen?

Tot nu toe is C# de enige taal die ik tegengekomen ben waar het anders is.

D3C0Y

Legacy Member
ok in een nieuw project werkt uw code wel
en dat van die hoofdletters, tja dan hebben ze mij dat verkeerd geleerd op school :p

maar dat is dan niet in een applet, terwijl de code die ik post gebruikt wordt in een web-applet (zou normaal niet zoveel mogen uitmaken ?)
+ ge zegt dat ik verder kan met mijn code uit de beginpost, maar ik snap dit eerlijk gezegd niet :p

Code:
byte[] readIn = new byte[8];
int bytesRead = filesource.read(readIn);
OutputStream stream = System.out;
while(bytesRead != -1){
       stream.write(readIn);
       bytesRead = filesource.read(readIn);
}

Tis de eerste keer dat ik eigenlijk met java werk, maarja voor school zijn ze weer plezant en geven ze een opdracht in java aan mensen die alleen maar C++ hebben gezien

D3C0Y

Legacy Member
Ok nevermind, ik moet dus met die InputStream werken, dus eerst InputStream aanmaken en dan in mijn document die InputStream gebruiken

sebiet is testen of dat het werkt in mijn web-applet

*edit* het werkt niet in een web-applet, maar wel in een gewone applicatie :s
enig idee aan wat dat zou kunnen liggen ? (het is identiek dezelfde code)

dit is mijn code geworden na uw oplossing
Code:
package facebookgame.parsing;

import java.net.URL;
import java.io.InputStream;
import java.util.ArrayList;

import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.Element;

public class XmlParser 
{     
    public ArrayList SearchXml(String filename, String typeList, int typeNumber)
    { 
        ArrayList <String> parsedList = new ArrayList();
  
        try
        {
            InputStream filesource = new URL("http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml").openStream();
            System.out.println("found input source");

            //1. Build the document with SAX and Xerces, no validation
            SAXBuilder builder = new SAXBuilder();
            System.out.println("build SAX");
            
            // 2.Create the document
            Document doc = builder.build(filesource);
            System.out.println("Created document");
            
            // 3. Create a root Element for fast use
            Element root = doc.getRootElement();
            System.out.println("got rootElement");
            
            // 4. Check all childNodes of root for typeNumber 
            for (int i=0;i<root.getChildren().size();i++)
            {
                // I. Cast the current child into a temporary Element
                Element Child = (Element) root.getChildren().get(i);

                // II. If the current child has the right type, push his children back into vector
                if (Child.getAttribute("type").getIntValue() == typeNumber)
                {
                    for (int j=0;j<Child.getChildren().size();++j)
                    {
                        Element GrandChild = (Element) Child.getChildren().get(j);
                        String childValue = GrandChild.getValue();
                        parsedList.add(j,childValue);
                    }
                    
                    return parsedList;
                }
            } 
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        return null;
    }
}

Cycloon

Legacy Member
Uw host blokkeert toegang tot externe files? Of het is 1 of ander security issue ergens :)

D3C0Y

Legacy Member
dus het ligt aan de webspace van telenet dan ?

kheb vlug is een web-applet gemaakt met gelijkaardige code dat ik gebruik in mijn oorspronkelijk web-applet. Mischien doe ik wel nog iets fout

Code:
package javaapplication;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.util.ArrayList;

import javaapplication7.parsing.XmlParser;

public class Main extends Applet
{   
    protected Thread gameThread = null;
    private Canvas display_parent = null;
    private boolean running = false;
    private XmlParser parser = new XmlParser();
    
    public void destroy()
    {
        remove(display_parent);
        super.destroy();
        System.out.println("Clear Up");
    }
        
    public void start()
    {
        gameThread = new Thread()
        {
            public void run()
            {
                running = true;
                
                System.out.println("Entering Gameloop");
                gameLoop();
            }
        }; 
        gameThread.setDaemon(true);
        gameThread.start();
    }
    
    public void stop()
    {
        //
    }
        
    public void init()
    {
        setLayout(new BorderLayout());
        try
        {
            display_parent = new Canvas()
            {
                public final void removeNotify()
                {
                    super.removeNotify();
                }
            };
            display_parent.setIgnoreRepaint(true);
            display_parent.setSize(getWidth(),getHeight());
            add(display_parent);
            display_parent.setFocusable(true);
            display_parent.requestFocus();
            setVisible(true);
        }
        catch(Exception e)
        {
            System.err.println(e);
            throw new RuntimeException("Unable to create display");
        }  
    }
    
    private void gameLoop()
    {
        ArrayList <String> temp = null;
        while (running)
        {     
            temp = parser.SearchXml("http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml", "BulletList",2);
            
            for (int i=0;i<temp.size();++i)
            {
                System.out.println(temp.get(i));
            }
        }
    }
}

html-file:

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>AppletLoader</title>
  </head>
  <body>

  <applet code="org.lwjgl.util.applet.AppletLoader" archive="lib/lwjgl_util_applet.jar, lib/lzma.jar" codebase="." width="800px" height="600px">
  
    <!-- The following tags are mandatory -->
    
    <!-- Name of Applet, will be used as name of directory it is saved in, and will uniquely identify it in cache -->
    <param name="al_title" value="appletloadertest">
    
    <!-- Main Applet Class -->
    <param name="al_main" value="javaapplication.Main">
    
    <!-- logo to paint while loading, will be centered -->
    <param name="al_logo" value="appletlogo.png">
    
    <!-- progressbar to paint while loading. Will be painted on top of logo, width clipped to percentage done -->
    <param name="al_progressbar" value="appletprogress.gif">
    
    <!-- List of Jars to add to classpath -->
    <param name="al_jars" value="JavaApplication7.jar">
    
    <!-- signed windows natives jar in a jar --> 
    <param name="al_windows" value="lib/windows_natives.jar.lzma">
    
    <!-- signed linux natives jar in a jar --> 
    <param name="al_linux" value="lib/linux_natives.jar.lzma">
    
    <!-- signed mac osx natives jar in a jar --> 
    <param name="al_mac" value="lib/macosx_natives.jar.lzma">

    <!-- signed solaris natives jar in a jar --> 
    <param name="al_solaris" value="lib/solaris_natives.jar.lzma">
    
    <!-- Tags under here are optional -->
    
    <!-- Version of Applet, important otherwise applet won't be cached, version change will update applet, must be int or float -->
    <!-- <param name="al_version" value="0.1"> -->
    
    <!-- background color to paint with, defaults to white -->
    <!-- <param name="al_bgcolor" value="000000"> -->
    
    <!-- foreground color to paint with, defaults to black -->
    <!-- <param name="al_fgcolor" value="ffffff"> -->
    
    <!-- error color to paint with, defaults to red -->
    <!-- <param name="al_errorcolor" value="ff0000"> -->
    
    <!-- whether to run in debug mode -->
    <!-- <param name="al_debug" value="true"> -->
    
    <!-- whether to prepend host to cache path - defaults to true -->
    <param name="al_prepend_host" value="false">
    
    <!-- main applet specific params -->
    <param name="test" value="test">
  
  </applet>

  <p>
    if <code>al_debug</code> is true the applet will load and extract resources with a delay, to be able to see the loader process.
  </p>

  </body>
</html>

dJeez

Legacy Member
eniac zei:
En argh:
- accolades openen op de lijn zelf :p
:offtopic: Dat hangt van de gebruikte coding convention af, uit ervaring weet ik ondertussen dat ze allebei afwisselend bij grote bedrijven worden voorgeschreven (niet specifiek voor Java alleen overigens). De grappigste zijn wel die die beide methodes door elkaar gebruiken in hun conventie, vb. bij functie declaraties moet je de accolades onder elkaar zetten, bij if ... else (en herhalingen) op dezelfde regel. Dat maakt het er voor mij niet overzichtelijker op, maar soit, klant is koning.

eniac

Legacy Member
D3C0Y, ik heb helaas nog nooit iets met applets gedaan dus met applet-specifieke problemen (zoals dit er 1 lijkt) kan ik je helaas niet vooruithelpen...

dJeez zei:
:offtopic: Dat hangt van de gebruikte coding convention af, uit ervaring weet ik ondertussen dat ze allebei afwisselend bij grote bedrijven worden voorgeschreven (niet specifiek voor Java alleen overigens).

Heb het enkel nog maar zo geweten, zowel bij klanten als bij mijn werkgever (die qua Java toch redelijk hoog staat aangeschreven, niet in het minst omwille van Stephan Janssen :) ). Bij mijn huidige klant houden de ant-scripts zelfs de builds tegen als er accolades op een volgende lijn staan.

Maar ik besef goed genoeg dat dit geen harde conventie is en zeer plaats- en klantafhankelijk.

D3C0Y

Legacy Member
mja ksnap niet waarom het vanuit een gewone java applicatie wel werkt met dezelfde url, maar via een applet in een browser niet :s

eniac

Legacy Member
Applets hebben wel meer restricties dan gewone Java desktop-progs, misschien ligt het daaraan. Niet dat ik het logisch zou vinden.

Ollie

Legacy Member
Als ik mij niet vergis mag een applet zich enkel connecteren met de server vanwaar hij gedownload is (waarop hij dus gehost is).

eniac

Legacy Member
Hmm, idd:

Network Restrictions

The network restrictions in Java may seem a little overboard, but they are there for good reason. The general philosophy of network security is that applets can only make network connections back to the Web server they were loaded from. An applet may not listen for incoming socket connections, nor can it listen for datagrams (connectionless network data) from anywhere but its home server. It also can only send datagrams back to its home server.

These security restrictions are intended to protect organizations that have Internet firewalls set up. In case you are unfamiliar with the intricacies of Internet security, many companies have large internal IP networks (the main networking protocol of the Internet). These networks are connected to the rest of the world through machines called "firewalls." A firewall's job in life is to protect the internal IP network from prying eyes in the outside world while allowing people on the inside to access data out on the Internet. These firewalls usually render the internal network invisible to the rest of the world. Given the clever ways people have found to attack systems, it is best to not give out any information about host names or addresses on the internal network.

The problem with Java is that applets run inside the firewall on your local machine. This means that without any network restrictions, your entire network is exposed to any malicious applets. You might be thinking that it would be nice if you could just tell your browser the names of hosts that you trust. It would not be difficult for the security system in Java to handle that, but it would keep your poor network administrator on a steady supply of indigestion medication, wondering when someone will trust an untrustworthy host. If you're an administrator at a site using HotJava, go ahead and get yourself a good spoonful of Maalox-you can completely turn off the networking restrictions in HotJava! Keep in mind, also, that Internet Explorer also lets you turn off all security restrictions. Netscape does not support such an option, however.

If your applet is loaded from the local filesystem, you can get around these security restrictions. You may have to set the appletviewer.security.mode system property to unrestricted to completely get around these restrictions. Because one of the other restrictions on applets is that they cannot change the system properties, you'll have to come up with unique ways of getting around this.

Achja. Applets, who needs them :p

D3C0Y

Legacy Member
mja tis voor school :p
het werkt nu ondertussen half en half

ik heb het inlezen van die xml werkende gekregen, maar nu krijg ik lwjglexceptions :s (lightweight)

D3C0Y

Legacy Member
ziet er belovend uit, ksnap wel niet goed waar ik die policy file moet steken en hoe die aangeroepen wordt.
Stel mijn applicatie noemt "Test" dan maak ik een policy file zoals deze ?

Code:
grant codeBase "File:/P:/School/Integration 3/Project 2 - Facebook Game/Assembla/Source/Test.jar" {
  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute";
};

hoe bepaal ik hiermee dat die files (bv. http://users.telenet.be/decoy/FacebookApp/xml/BulletType.xml) kan aanroepen op mijn webspace, want ik vermeld toch nergens de url van mijn space ?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan