Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
OpperDev

Parser du XML

12 messages dans ce sujet

Version (serveur) : 1.8
API utilisée : PaperSpigot
IDE utilisé : Eclipse
Explications du problème rencontré : Je créer actuellement un plugin de bannissements, tout ce qui a de plus normal, mais j'ai ajouté une fonctionnalité : Quand un joueur est banni, ça créer un fichier .xml avec l'uuid du joueur, avec des infos dedans, concrètement, le fichier xml ressemble a ça :

Spoiler
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<banReport>
	<player>
		<name>OpperDev</name>
		<uuid>4710e97f-9f6c-4b8e-abfa-2548feb898bc</uuid>
	</player>
	<moderator>
		<name>OpperDev</name>
		<uuid>4710e97f-9f6c-4b8e-abfa-2548feb898bc</uuid>
	</moderator>
	<reason>Reason of the ban</reason>
	<date>29/01/2018 20:19:32</date>
	<tempBan>true</tempBan>
	<tempBanTime>3</tempBanTime>
	<tempBanTimeUnit>MIN</tempBanTimeUnit>
	<infos>
		<worldName>world</worldName>
		<serverName>dev</serverName>
	</infos>
</banReport>

 

Et j'ai créer une commande pour récupérer le nombre de bans reports d'un joueur, ainsi que les voir (ça ouvre un inventaire avec des items, et les infos du ban report)

Problème : pour ça il faudrais parser le fichier xml pour en récupérer le contenu, j'ai cherché un peu sur google, et j'ai vraiment du mal a comprendre le bordel avec les Document, Element, DocumentBuilder, Node, NodeList et tout le bordel, j'ai essayé de faire un début mais bon, NPE, alors je reprend depuis le début, si possible je souhaiterait une méthode comme ceci :

Spoiler
public static String getValue(File file, String element){
	return <la valeur>
}

(Donc si je fais par exemple getValue(<lePathDuFichierXmlQuiSeTrouveAuDessus>, "moderatorName"); ou bien getValue(<lePathDuFichierXmlQuiSeTrouveAuDessus>, "tempBanTimeUnit"); beh ça me retourne OpperDev ou bien MIN)


Recherches effectuées : Google, StackOverFlow, OCR
Code d'erreur : //
Code : //
Informations supplémentaires : //

 

Merci d'avance ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai trouvé ceci

 

Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request"))
    System.out.println(e);

Essaie-le en débug et normalement ça va te sortir toutes les données du fichier dans la console :)

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourquoi ce format ? Tu utiliserai Gson ça serait beaucoup mieu ou une bdd. 

2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 11 heures, Maxx_Qc a dit :

J'ai trouvé ceci

 

Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request"))
    System.out.println(e);

Essaie-le en débug et normalement ça va te sortir toutes les données du fichier dans la console :)

Pas bête l'ami ! je pensait que Jsoup parsait uniquement du html ;) mais concrètement où est-ce que je met par exemple moderatorName ou playerUuid pour récupérer uniquement ça ? :P

Parce que si ça parse uniquement le fichier et laisse les valeurs tel quels comment les récupérer ? ^^

Il y a 5 heures, PimaPvP a dit :

Pourquoi ce format ? Tu utiliserai Gson ça serait beaucoup mieu ou une bdd. 

XML car ça me parait sympa et simple a comprendre

Pas de bdd car ça serait trop long et chiant alors que la ben je créer le fichier vite fait en 1 ligne et c'est calé :P

Et pas Gson pour 2 raisons :

1) J'utilise un paperspigot qui est sur mon repo local, et quand j'utilise gson : classnotfoundexception

2) Car d'après ce que je sais sur GSON on ne peut pas écrire seul son fichier, gson sérialize ^^ (Je me trompe surement)

 

EDIT: @PimaPvP si tu veux tout savoir voilà comment je créer le .xml ;) c'est surement pas la bonne manière car pareil j'ai vu que y'avais moyen avec sax/dom mais bon cette manière fonctionne aussi :

Spoiler
	public static void saveFile(File file, int[] tabchif, String[] tablet) {
		try {
			createFile(file);
			PrintWriter out = new PrintWriter(new FileWriter(file));
			for(int i = 0; i < tabchif.length; i++) {
				out.println(tablet[i]);
			}
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
                                              
FileUtils.saveFile(new File(Main.instance.getDataFolder() + "/banreports/"+banReport.getPlayerUUID()+" #"+i+".xml"), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }, new String[] { 
				"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>",
				"<banReport>",
				"	<player>",
				"		<name>"+banReport.getPlayerName()+"</name>",
				"		<uuid>"+banReport.getPlayerUUID()+"</uuid>",
				"	</player>",
				"	<moderator>",
				"		<name>"+banReport.getModeratorName()+"</name>",
				"		<uuid>"+banReport.getModeratorUUID()+"</uuid>",
				"	</moderator>",
				"	<reason>"+banReport.getReason()+"</reason>",
				"	<date>"+banReport.getDate()+"</date>",
				"	<tempBan>"+tempBan+"</tempBan>",
				"	<tempBanTime>"+tempBanTime+"</tempBanTime>",
				"	<tempBanTimeUnit>"+tempBanTimeUnit.getUNIT()+"</tempBanTimeUnit>",
				"	<infos>",
				"		<worldName>"+player.getWorld().getName()+"</worldName>",
				"		<serverName>" + file != null ? file.isDirectory() ? file.getName() : "null" : "null" + "</serverName>",
				"	</infos>",
				"</banReport>"
		});

 

 

 

 

EDIT 2 :

Finalement @Maxx_Qc je suis tombé sur le même post StackOverFlow que toi, et j'ai opté pour ceci :

Spoiler
	public static List<String> readFile(File file){
		List<String> list = new ArrayList<String>();
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String line;
			while((line = reader.readLine()) != null) {
				list.add(line);
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	public static String getValue(String xml, String tagName) {
		return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0];
	}

 

Donc dans ma commande ça donne ça :

Spoiler
	private Inventory buildInventory(Player player) {
		CustomInventory customInventory = new CustomInventory(Main.instance, "banCheck-"+player.getName(), false, null, "§cBanReports > "+player.getName(), 54);
		int i = 0;
		for(File f : Utils.getBanReports(player)) {
			List<String> list = FileUtils.readFile(f);
			boolean tempBan = Boolean.parseBoolean(FileUtils.getValue(list.get(12), "tempBan"));
			long tempBanTime = Long.parseLong(FileUtils.getValue(list.get(13), "tempBanTime"));
			EBans tempBanTimeUnit = EBans.getByUNIT(FileUtils.getValue(list.get(14), "tempBanTimeUnit"));
			customInventory.addItems(new CustomItem(Material.BEDROCK, 1).setName("§4"+FileUtils.getValue(list.get(3), "name")+" #"+(i+1))
					.addLores(
							"§5Banni par : "+FileUtils.getValue(list.get(7), "moderatorName"),
							"§5Raison : "+FileUtils.getValue(list.get(10), "reason"),
							"§5Date : "+FileUtils.getValue(list.get(11), "date"),
							tempBan ? "§5Temps du ban : "+tempBanTime+" "+tempBanTimeUnit.getFrench() : ""
							)
					.build()
					);
			i++;
			if(i >= 50)break;
		}
		return customInventory.build();
	}

 

 

Vous pensez que c'est bon ? ^^

Modifié par OpperDev

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah. Sans te mentir ton code (en écriture du xml en tout cas) est... pas du tout maintenable et pas propre. Le NotClassFound c'est bizarre ? Car avec gson c'est vraiment ultra facile, tu fais un gson.toJson(object, FileWriter) et il se charge de transformer ton objet en JSON et l'écrit pour toi dans le fichier ! Tu n'as plus qu'à fermer le FileWriter. Tu peux même sauvegarder des listes, des HashMaps... C'est vraiment une super lib. Et en JSON tu as vraiment le concept de clé valeur...

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 30/01/2018 à 19:02, PimaPvP a dit :

Ah. Sans te mentir ton code (en écriture du xml en tout cas) est... pas du tout maintenable et pas propre. Le NotClassFound c'est bizarre ? Car avec gson c'est vraiment ultra facile, tu fais un gson.toJson(object, FileWriter) et il se charge de transformer ton objet en JSON et l'écrit pour toi dans le fichier ! Tu n'as plus qu'à fermer le FileWriter. Tu peux même sauvegarder des listes, des HashMaps... C'est vraiment une super lib. Et en JSON tu as vraiment le concept de clé valeur...

Je sais mais je préfère tout de même utiliser xml ^.^

 

Bon j'ai trouvé quelque chose avec Jsoup qui parait plutôt fonctionnel :

 

Spoiler
File file = new File("XmlFile.xml");
Document doc = Jsoup.parse(file, "UTF-8");
Element root = doc.select("roodNode").first();
Elements childrens = root.children();
for(Element child : childrens){
	String firstValue = child.select("firstValue").text();
	String secondValue = child.select("secondValue").text();
}

 

 

Modifié par OpperDev

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 1 heure, OpperDev a dit :

Je sais mais je préfère tout de même utiliser xml ^.^

 

Bon j'ai trouvé quelque chose avec Jsoup qui parait plutôt fonctionnel :

 

  Masquer le contenu

File file = new File("XmlFile.xml");
Document doc = Jsoup.parse(file, "UTF-8");
Element root = doc.select("roodNode").first();
Elements childrens = root.children();
for(Element child : childrens){
	String firstValue = child.select("firstValue").text();
	String secondValue = child.select("secondValue").text();
}

 

 

Je comprends pas pourquoi tu veux utiliser ce format ? (ou du moins comment tu l'utilise)

Modifié par PimaPvP
1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, PimaPvP a dit :

Je comprends pas pourquoi tu veux utiliser ce format ? (ou du moins comment tu l'utilise)

Tant pis c'est pas ma demande ^^'

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 34 minutes, OpperDev a dit :

Tant pis c'est pas ma demande ^^'

:mellow:

Ca ne me dit pas pourquoi tu veux utiliser ce format. Un peu bizarre de forcer avec ton idée sans aucune raison valable.

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 31/01/2018 à 21:29, PimaPvP a dit :

:mellow:

Ca ne me dit pas pourquoi tu veux utiliser ce format. Un peu bizarre de forcer avec ton idée sans aucune raison valable.

Tout simplement parce que j'ai envie de faire ça par xml, parce que avec gson on ne peut pas chosir concrètement ce qu'on écrit dans son fichier, on peut passer a autre chose ?

 

Ma demande était pourtant bête, comment parser du xml afin de récupérer la valeur associée a la clé ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.