Jeg er igang med at lave et bruger system til en IRC bot. Brugerene bliver gemt i en XML fil, så de kan loades ind igen, vis programmet skal genstartes.
Her er et eksempel på hvordan XML filen kan se ud:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<nick>ismetteren</nick>
<pass>admin</pass>
<level>2</level>
</user>
<user>
<nick>ismettern</nick>
<pass>admin2</pass>
<level>2</level>
</user>
<user>
<nick>deleteme</nick>
<pass>mypass</pass>
<level>0</level>
</user>
<user>
<nick>test</nick>
<pass>test</pass>
<level>1</level>
</user>
</users>
Jeg har før postet omkring det problem jeg har nu, nemlig at søge efter en bruger i et DOM tre, og slette den fra det. På det tidspunkt havde jeg en rekrusiv funktion til at søge træet igennem. Det blev foreslået at bruge XPath istedet, hvilket jeg nu er igang med.
- private Node getXMLUser(String user) {
- XPath xPath = XPathFactory.newInstance().newXPath();
- String expression = "users/user/nick/text()";
- InputSource xmlDoc = new InputSource(userPath);
- NodeList nicks;
- try {
- nicks = (NodeList)xPath.evaluate(expression, xmlDoc, XPathConstants.NODESET);
-
- for(int i = 0; i < nicks.getLength(); i++) {
- Node nickNode = nicks.item(i);
- if(nickNode.getNodeValue().equalsIgnoreCase(user)) {
- return nickNode.getParentNode().getParentNode();
- }
- }
- } catch (XPathExpressionException e) {
- e.printStackTrace();
- }
-
- return null;
- }
Denne funktion får en liste over alle tekst undernoder af nick. Vis en af dem er ligmed navnet på den bruger vi søger, retunere den dens parrents parrent node (noden to niveauer over den, altså den user node den er i)
Problemet er, at den user node IKKE bliver fjernet fra XML dokumentet når jeg kører følgende kode:
- users.remove(getUser(botCmd[1]));
- Node n = getXMLUser(botCmd[1]);
- if(n != null) {
- n.getParentNode().removeChild(n);
- outputXML();
- }
linjen: users.remove(getUser(botCmd[1])); sletter brugeren i selve programmet(ikke XML filen, eller DOM træet. Kan godt være det ikke er optimalt at læse bruger status over i et andet objekt, når man nu har et DOM træ, men det kan jeg kigge på senere), dette fungere fint.
outputXML() funktionen ser således ud:
public void outputXML() {
try {
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(userPath);
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
Men jeg tror ikke det er her problemet ligger, da den fungere fint når jeg vil tilføje brugere til mit dokument.
Håber der er nogle der kan hjælpe
Indlæg senest redigeret d. 29.06.2009 20:17 af Bruger #13669