关于Java和Python的XML问题
我正在尝试用Python 2.7写一个应用程序,目的是让用户可以打开一个对话框,选择一个文件,然后把这个文件读入某种结构中(比如数组列表、列表等等……这里欢迎建议),接着从数据中找出一些基本的统计指标(比如平均值、标准差等等),最后把原始文件和统计结果以XML格式输出。我在想,怎么做这个事情最合适。我有一段代码可以打开一个窗口,让用户选择文件(是从另一个网站上找到的),但我不太确定怎么把选中的文件传递给读取XML文件的函数。
这是打开窗口的代码:
from Tkinter import *
from tkMessageBox import *
from tkColorChooser import askcolor
from tkFileDialog import askopenfilename
def callback():
askopenfilename()
Button(text='Please Select File', command=callback).pack(fill=X)
mainloop()
pass
def quit(event):
if tkMessageBox.askokcancel('Quit','Do you really want to quit?'):
root.destroy()
我觉得传递文件的函数可能还有更多内容。
我有一个Java版本的XMLReader(是在BlueJ里运行的,所以不知道它在外面能不能运行),代码如下:
import java.util.*;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLReader
{
public static void main(String argv[]) {
ArrayList XTimeStamp = new ArrayList();
ArrayList XY = new ArrayList();
ArrayList Price = new ArrayList();
try {
File file = new File("<PATH>\shares.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
System.out.println("Root element " + doc.getDocumentElement().getNodeName());
NodeList nodeLst = doc.getElementsByTagName("shareprice");
System.out.println("Share Price");
for (int s = 0; s < nodeLst.getLength(); s++) {
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("timeStamp");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
String timeStamp = fstNm.item(0).getNodeValue();
XTimeStamp.add(timeStamp);
System.out.println("timeStamp : " + ((Node) fstNm.item(0)).getNodeValue());
NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("Price");
Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
NodeList lstNm = lstNmElmnt.getChildNodes();
String YValue = lstNm.item(0).getNodeValue();
Price.add(YValue);
System.out.println("Price : " + ((Node) lstNm.item(0)).getNodeValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(XTimeStamp);
System.out.println(Price);
XY.add (XTimeStamp);
XY.add (Price);
System.out.println(XY);
}
}
我不喜欢Java代码中的一点是,我必须要写出文件的路径。我希望在Java版本中也能让用户选择文件。我之所以开始用Java,是因为我对它稍微有点经验(但不多)。那么,要创建这个应用程序,使用Python还是Java更好呢?根据选择的语言,任何关于如何开始解决这些问题的帮助都会非常感激。
1 个回答
好吧,你可以用Python或者Java来做这个事情,其实都不难,但你得先决定用哪个!我会讲讲Python,因为我更喜欢它,不过肯定也有人愿意帮你用Java。
首先,你需要一个文件选择框,可以用Tkinter
来实现。这是很常见的做法,网上有很多相关的文档和代码示例。你可以试试:
import Tkinter,tkFileDialog
root = Tkinter.Tk()
file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a file')
这只是个开始;如果你想的话,可以让它变得更复杂。接下来,你可以用Python的xml.parsers.expat
模块来解析文件:
import xml.parsers.expat
xmlparser.ParseFile( file )
你需要为解析器遇到的每种节点类型写一些函数,具体怎么写可以参考文档。然后,你可能还想对解析出来的数据做一些统计;scipy
里有你需要的所有函数。这部分你可能需要自己写代码。
最后,你可能想把生成的统计结果写入一个新文件(我想是这样吧?)。
statsfile = open( "stats.txt", w )
try:
statsfile.write( stats )
finally:
statsfile.close()
这样说清楚了吗?