我有一些循环遍历XML文件的代码,并获取<savedPositions>
的每个实例。我试图将每个数据添加到一个数组中,以便我可以返回它并使用我的UI中的字符串 - 我不知道如何通过显示{{1的每个实例将数据读回我的应用程序在每个按钮上单击。这意味着我只在我的文本框中显示<savedPositions>
的一个实例。
我如何制作它以便在每个按钮上单击文本框以使用下一个<savedPositions>
信息更新? - 谢谢
我的XML:
<savedPositions>
阅读XML代码:
<savedPositions>
<savedPosition>
<nBehaviour>nBehaviour1</nBehaviour>
<aBehaviour>aBehaviour1</aBehaviour>
<findings>findings1</findings>
<forces>forces1</forces>
<gap>gap1</gap>
<position1>0.6488889</position1>
<position2>-1000.0</position2>
</savedPosition>
<savedPosition>
<nBehaviour>nBehaviour2</nBehaviour>
<aBehaviour>aBehaviour2</aBehaviour>
<findings>findings2</findings>
<forces>aBehaviour2</forces>
<gap>gap2</gap>
<position1>-1000.0</position1>
<position2>-1000.0</position2>
</savedPosition>
</savedPositions>
点击按钮调用XML:
public class XmlToObject {
public static ArrayList<ArrayList<String>> main() {
ArrayList<ArrayList<String>> obj1 = new ArrayList<ArrayList<String>>();
ArrayList<ArrayList<String>> obj = new ArrayList<ArrayList<String>>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse("/home/nicolas/savedPos.xml");
XPath xp = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList) xp.compile("//savedPosition").evaluate(d, XPathConstants.NODESET);
System.out.println("number of saved positions " + nl.getLength());
for (int i = 0; i < nl.getLength(); i++) {
String a = (xp.compile("./nBehaviour").evaluate(nl.item(i)));
String b = (xp.compile("./aBehaviour").evaluate(nl.item(i)));
String c = (xp.compile("./gap").evaluate(nl.item(i)));
String d1 = (xp.compile("./forces").evaluate(nl.item(i)));
String e = (xp.compile("./findings").evaluate(nl.item(i)));
String f = (xp.compile("./position1").evaluate(nl.item(i)));
String g = (xp.compile("./position2").evaluate(nl.item(i)));
ArrayList<String> savedPosition = new ArrayList<String>();
savedPosition.add(a);
savedPosition.add(b);
savedPosition.add(c);
savedPosition.add(d1);
savedPosition.add(e);
savedPosition.add(f);
savedPosition.add(g);
obj.add(savedPosition);
}
return obj;
} catch (Exception l) {
System.out.println(l.getMessage());
}
return obj1;
}
}
答案 0 :(得分:0)
仅解析您的XML文件一次,并声明一个整数来跟踪当前显示的位置
List<List<String>> obj = XmlToObject.main();
int displayedPositionIndex = 0;
然后在你的ActionListener上,增加你的计数器并显示下一个位置
load.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
displayedPositionIndex++;
if(displayedPositionIndex >= obj.size()) {
displayedPositionIndex = 0; // to loop back to first after last position
}
setPosition(displayedPositionIndex);
}
});
我使用这种实用方法使事情更清晰
private void setPosition(int index) {
List<String> positionData = obj.get(index);
textArea.setText(positionData.get(0));
textArea1.setText(positionData.get(1));
textArea2.setText(positionData.get(2));
textArea3.setText(positionData.get(3));
textArea4.setText(positionData.get(4));
mediaPlayerComponent.getMediaPlayer().setPosition(Float.parseFloat(positionData.get(5)));
mediaPlayerComponent2.getMediaPlayer().setPosition(Float.parseFloat(positionData.get(6)));
}
注意强>
在你的XmlToObject中,最好使用List<List<String>>
而不是ArrayList<ArrayList<String>>
(如果可以的话,总是使用接口):
class XmlToObject {
public static List<List<String>> main() {
List<List<String>> positions = new ArrayList<>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse("/path/to/savedPos.xml");
XPath xp = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList) xp.compile("//savedPosition").evaluate(d, XPathConstants.NODESET);
System.out.println("number of saved positions " + nl.getLength());
for (int i = 0; i < nl.getLength(); i++) {
String a = (xp.compile("./nBehaviour").evaluate(nl.item(i)));
String b = (xp.compile("./aBehaviour").evaluate(nl.item(i)));
String c = (xp.compile("./gap").evaluate(nl.item(i)));
String d1 = (xp.compile("./forces").evaluate(nl.item(i)));
String e = (xp.compile("./findings").evaluate(nl.item(i)));
String f = (xp.compile("./position1").evaluate(nl.item(i)));
String g = (xp.compile("./position2").evaluate(nl.item(i)));
List<String> savedPosition = Arrays.asList(a, b, c, d1, e, f, g);
positions.add(savedPosition);
}
} catch (Exception e) {
e.printStackTrace();
}
return positions;
}
}