【问题标题】:Trying to get my Java IRC Bot to parse and write to an preexisting XML file试图让我的 Java IRC Bot 解析并写入预先存在的 XML 文件
【发布时间】:2015-11-13 03:13:49
【问题描述】:

我完全是 Java 处女,在为我的朋友开发 IRC 机器人方面我一直在缓慢但肯定地跌跌撞撞。到目前为止,我已经获得了几乎所有的功能。但是,我真的为这个问题绞尽脑汁,到目前为止,我的机器人可以回复一个链接,但是每周,我都必须手动更改 java 文件中的链接并重新编译整个东西。因此,我希望它能够解析与机器人的 java 文件所在目录相同的 XML 文件中的相关值,并能够通过 IRC 客户端更新这些相同的值。

import org.jibble.pircbot.*;

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
import org.w3c.dom.*;



public class ModBot extends PircBot {

static String inputFile = "./botdata.xml";
static String outputFile = "./botdata.xml";

public ModBot() {
    setLogin("ModBot");
    this.setName("ModBot");
    setVersion(" ");
}

public void onMessage(String channel, String sender, String login, String hostname, String message) {

if (message.equalsIgnoreCase("!lolcat")) {
sendMessage(channel, sender + "http://i.imgur.com/4IX4cUL.jpg");
}

if (message.startsWith("!updatelolcat ")) {
    if(login.equals("Mainmod"));
    String changelolcat = message.substring(14);


}
}
}

还有 XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE botdata [
<!ELEMENT botdata (lolcat,partytime,start,end)>
<!ELEMENT lolcat (#PCDATA)>
<!ELEMENT partytime (start,end)>
<!ELEMENT start (#PCDATA)>
<!ELEMENT end (#PCDATA)>
]>
<botdata>
<lolcat>http://i.imgur.com/4IX4cUL.jpg</lolcat>
<partytime>
<start>8:45:30</start>
<end>11:00:00</end>
</partytime>
</botdata>

我想要做的是获取任何“changelolcat”,并覆盖 XML 中的当前链接,然后从相同的 XML 中读取以将“lolcat”中的内容发送给任何回复“!lolcat”的人。我一直在经历 xpath 和 jdom 之类的东西,我就是无法理解它。我通过使用 xpath 的方法阅读的内容看起来很有希望,而且我更喜欢使用它,因为它更易于阅读。

编辑:

成功了,我加入了

try {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        Document document = documentBuilder.parse("botdata.xml");

        Node botdata = document.getElementsByTagName("botdata").item(0);

        NodeList nodes = botdata.getChildNodes();

        for (int i = 0; i < nodes.getLength(); i++) {

            Node element = nodes.item(i);

            if ("lolcat".equals(element.getNodeName())) {
                element.setTextContent(changelolcat);
            }


        }

        TransformerFactory transformerFactory = TransformerFactory.newInstance();

        Transformer transformer = transformerFactory.newTransformer();
        DOMSource domSource = new DOMSource(document);

        StreamResult streamResult = new StreamResult(new File("botdata.xml"));
        transformer.transform(domSource, streamResult);
    }catch (ParserConfigurationException pce) {
        pce.printStackTrace();
    } catch (TransformerException tfe) {
        tfe.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } catch (SAXException sae) {
        sae.printStackTrace();
    }

在字符串更改后lolcat = message.substring(14);

编辑:我想出了如何从我的 XML 中解析以将节点中的内容作为消息发送,这看起来对吗?我觉得我不应该以不同的方法一遍又一遍地复制文档生成器

        if (message.equalsIgnoreCase("!lolcat")) {
    try {
    DocumentBuilderFactory documentBuilderFactory =                 

    DocumentBuilderFactory.newInstance();

    DocumentBuilder documentBuilder =                       

    documentBuilderFactory.newDocumentBuilder();

    Document document = documentBuilder.parse(botxml);
                XPathFactory xpathFactory = XPathFactory.newInstance();
    XPath xpath = xpathFactory.newXPath();
                String lolcat = xpath.evaluate("//lolcat", document);

    sendMessage(channel, sender + lolcat);
    } catch (Exception e) {
                e.printStackTrace();

    }

}

【问题讨论】:

    标签: java xml xpath bots irc


    【解决方案1】:

    一种方法是使用javax.xml.parsers.DocumentBuilder 将您的xml 文件解析为javax.swing.text.Document,它为获取和修改单个元素及其值提供了一个很好的界面。然后,您可以将修改后的文档写回原始文件,并用新版本覆盖它。

    以下是相关 javadocs 的一些链接:

    您可能还想查看 DocumentBuilderFactory 对象的 javadocs,这绝对是生成 DocumentBuilders 的最佳方式。

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 2011-07-21
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多