与Java和Python相关的XML问题

时间:2010-07-23 09:17:04

标签: java python xml parsing

我正在尝试使用Python 2.7编写一个应用程序,它允许用户打开一个对话框,选择一个文件,将其读入某种类型的结构(ArrayList,List等...),这里有建议然后从数据中找到基本的统计测量(诸如平均值,标准偏差等等),并输出原始文件,其中包含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 个答案:

答案 0 :(得分:1)

嗯,你可以用Python或Java做到这一点而不会有太多困难,但我会决定你想要哪一个!我会谈论Python,因为我更喜欢Java,但我相信你能找到能帮助你使用Java的人。

首先,您需要一个带Tkinter的文件选择框。嗯,这是非常标准的,Google上有很多文档和代码样板。尝试:

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

这有帮助吗?