如何用Java从XML指定ID的父标签中随机获取ans子标签内容
实现XML匹配的随机应答方法
需求说明
需要完成Java方法String function(String id)的实现,功能如下:
- 传入id后,在XML文件中找到对应
id属性的<question>标签 - 随机返回该
<question>标签下任意一个<ans>标签的内容 - 若不存在对应id的
<question>标签,则返回<default>标签的内容
XML文件内容
<?xml version="1.0"?> <class> <question id="scores"> <ans>12</ans> <ans>32</ans> <ans>44</ans> </question> <question id="ratings"> <ans>10</ans> <ans>22</ans> <ans>45</ans> <ans>100</ans> </question> <default> Sorry wrong </default> </class>
已有ChatBot类代码
import org.w3c.dom.Document; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; public class ChatBot { private String filepath="E:\\myfile.xml"; private File file; private Document doc; public ChatBot() throws SAXException, IOException, ParserConfigurationException { file = new File("E:\\myfile.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(file); } String function(String id){ // 需要补充实现的部分 return null; } }
注:原代码中文件路径的反斜杠需要转义为\\,否则会出现编译错误,已在上述代码中修正
补充实现function方法
import java.util.Random; import org.w3c.dom.Element; import org.w3c.dom.NodeList; // 在ChatBot类中替换原function方法的实现 String function(String id) { // 查找对应id的question标签 NodeList questionNodes = doc.getElementsByTagName("question"); Element targetQuestion = null; for (int i = 0; i < questionNodes.getLength(); i++) { Element question = (Element) questionNodes.item(i); if (id.equals(question.getAttribute("id"))) { targetQuestion = question; break; } } // 找到目标question则随机返回一个ans内容 if (targetQuestion != null) { NodeList ansNodes = targetQuestion.getElementsByTagName("ans"); if (ansNodes.getLength() > 0) { Random random = new Random(); int randomIndex = random.nextInt(ansNodes.getLength()); Element ansElement = (Element) ansNodes.item(randomIndex); return ansElement.getTextContent().trim(); } } // 未找到对应id或无ans节点,返回default内容 NodeList defaultNodes = doc.getElementsByTagName("default"); if (defaultNodes.getLength() > 0) { Element defaultElement = (Element) defaultNodes.item(0); return defaultElement.getTextContent().trim(); } // 极端兜底:连default标签都不存在时返回 return "Unknown error"; }
关键逻辑说明
- 通过DOM API遍历所有
<question>节点,匹配传入的id属性,定位目标节点 - 找到目标节点后,获取其下所有
<ans>子节点,用Random类随机选取一个返回内容(去除首尾空白) - 未匹配到目标节点时,读取
<default>标签的内容返回;若<default>标签也不存在,返回兜底提示
内容的提问来源于stack exchange,提问作者Ahtess_ Khan
相关产品推荐
相关产品推荐

