我正在尝试创建一个找到该元素的Java程序(我是XML的新手,并且不理解行话。它甚至被称为元素?!?),其值最高并返回围绕它的元素。以下是代码示例:
<conversation input="HELLO">
<output hits="3">
HI MATE
</output>
<output hits="8">
HELLO
</output>
</conversation>
它会找到哪个“输出”具有最多“命中”并返回它包含的值(EX.HELLO)。我正在尝试使用stAX,但你知道使用不同的东西做更好的方法,请继续前进!
编辑这是请求的完整代码:
package charles;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.swing.JOptionPane;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class NewClass {
//Memory
static String currentResult = null;
static int highestHits = 0;
private static String filename = "\\Files\\Java\\Projects\\CHARLES\\src\\charles\\Memory.xml";
static XMLEventReader reader;
public static void main(String args[]) throws XMLStreamException, FileNotFoundException {
try {
filename = "\\Files\\Java\\Projects\\CHARLES\\src\\charles\\Memory.xml";
} catch (ArrayIndexOutOfBoundsException aioobe) {
System.exit(0);
}
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader reader =
factory.createXMLEventReader(new FileReader(filename));
while (reader.hasNext()) {
XMLEvent e = reader.nextEvent();
System.out.println("ID:" + e.hashCode() + "[" + e + "]");
}
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "The file does not exist!" + "\nProgram is terminating.", "File Not Found", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
private static void analyze() {
while (reader.hasNext()) {
int event = (int) reader.next();
if (event == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals(input)) {
int currentHits = Integer.parseInt(reader.getAttributeValue(0));
if (currentHits > highestHits) {
highestHits = currentHits;
reader.next();
currentResult = reader.getText();
}
}
}
}
}
答案 0 :(得分:2)
你可以直接使用java XML DOM类来传递所有'output'元素并记录具有最大'hits'属性的元素。假设您已将XML转换为DOM Document对象'doc',然后将其传递给此类方法(如果没有'output'元素或者没有非零命中属性则返回null):
public String getHighest(Document doc) {
NodeList list = doc.getElementsByTagName("output");
String currentResult = null;
int highestHit = 0;
for (int i = 0; i < list.getLength(); i++) {
int hits = Integer.parseInt(((Element) list.item(i)).getAttribute("hits"));
if (hits > highestHit) {
highestHit = hits;
currentResult = list.item(i).getTextContent();
}
}
return currentResult;
}
这只适用于XML文档不是很大的情况,因为DOM解析器会在遍历之前将整个XML树加载到内存中。解析的XML树通常占用文件中XML的5到10倍。因此,如果您的XML文件大于几MB,则应使用SAX或StAX解析器。
对于StAX解析此类信息,假设您有一个名为“reader”的XMLStreamReader,那么下面的代码片段就可以工作(尽管您可能应该包含一些错误处理功能):
int highestHits = 0;
String currentResult = null;
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("output")) {
int currentHits = Integer.parseInt(reader.getAttributeValue(0));
if (currentHits > highestHits) {
highestHits = currentHits;
reader.next();
currentResult = reader.getText();
}
}
}
编辑重新:更新代码:
我认为问题在于你的代码'reader'是一个XMLEventReader(好吧,它不能编译的原因)。但在“分析”中,您可以在其上调用来自XMLStreamReader的方法。只需确保使用XMLStreamReader在“analyze”方法中执行操作。
答案 1 :(得分:0)
我建议使用DOM和XPATH以简单的方式解决这个问题。
这两个应该提供一些关于如何做到这一点的好主意: How to find the max attribute from an XML document using Xpath 1.0