关于Java和Python的XML问题

0 投票
1 回答
815 浏览
提问于 2025-04-16 01:43

我正在尝试用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 个回答

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()

这样说清楚了吗?

撰写回答