2013-03-08 39 views
0

===关于评论闭问题====始终从DSV(文本文件),其中每个记录都有一个不同的列的顺序排序列

虽然在示例中的数据被定位的最后的脚本将是有用对于任何拥有一组复杂XML文件的人来说,都可以将其转换为文本数据库,因为该进程可以在任何输入xml上工作,而不管归因如何。

===新信息==== 我已经能够生成初始过程中所有标记的列表,但是然后重新创建标记::文本对是不可行的,因为它必须运行1000年的xml,产生一个唯一的排序列表,然后重新读取xml并开始创建文本数据集。

因此,如果给出以下内容(或带有独特分隔符的任何文本),我可以通过并捕获标签吗?

:;:^1^L:\Vector_Data\Administrative\Boundaries\Federal_Govt\COM_ELB_region.shp_BaseMetadata.xml^citeinfo::None^descript::None^timeperd::None^status::None^distinfo::None^dataqual::None^cntinfo::None^metainfo::None^uniqueid::None^title::COM_ELB_region.shp^origin::None^custod::Tablelands Regional Council ^jurisdic::None^;:; 

(在这种情况下^是列分隔符和::是标签::文字分隔符)

我需要它给我像[citeinfo,timeprd,地位等]的标签列表然后遍历并创建另一个只包含文本的数据集。

我会强调,这不是本地化的解决方案将适用于任何需要解构的xml。

===原始的问题如下

我已经创建了由德构造许多不同的XML文档样式的文本文件。我将tag :: text记录在一起,因为每个文件的标签顺序略有不同。关键是原始xml文件的名称。

是否可以从数据中重建excel或'csv',以便所有文件都具有正确排序的列。

excel示例和原始数据可用here。我使用的脚本是here

感谢,

==== 这是很难得的从输出的标签列表,你会需要通过线走线和搜索标签,如果没有重复添加到列表。所以我决定在解析xml时生成一个标签列表更容易。这工作,但我有问题告诉脚本什么时候在xml中找不到有序列表中的标签。见下面的代码。

#------------------------------------------------------------------------------- 
# Name:  Convert xml data to csv with anzlic tagged data kept seperate 
# Purpose: Also has an excel template to convert the data into standard columns 
# 
# Author:  [email protected] 
# 
# Created:  05/03/2013 
# Copyright: (c) ATGIS. georgec 2013 
# Licence:  Creative Commons 
#------------------------------------------------------------------------------- 

import os, xml, shutil, datetime 
from xml.etree import ElementTree as et 
from lxml import etree 

SourceDIR=r'L:\Data_Admin\XML_CSV_Convertor\test_data' 
#SourceDIR=os.getcwd() 
rootDir=os.getcwd() 
log_name='t2_' 
xmllist=[] 
xmltaglist=[] 
x=0 

def locatexml(SourceDIR,x, rootDir, xmllist, xmltaglist): 
    for root, dirs, files in os.walk(SourceDIR, topdown=False): 
     for fl in files: 
      currentFile=os.path.join(root, fl) 
      ext=fl[fl.rfind('.')+1:] 
      if ext=='xml': 
       xmllist.append(currentFile) 
       print currentFile 
       x+=1 
##   try: 
       processxmltag(currentFile,x, rootDir, xmltaglist) 
##   except: 
##    print "Issue with file: "+ currentFile 
##    log=open(rootDir+'\\'+log_name+'issue_xml_log.txt','a') 
##    log.write(str(x)+'^'+currentFile+'\n') 
##    log.close 

    print "finished" 
    return xmllist, x, currentFile 

def processxmltag(currentFile,x, rootDir, xmltaglist): 
    from collections import OrderedDict 
    with open(currentFile) as f: 
     tree = etree.parse(f) 
    for tagn in tree.iter(tag=None): 
     if tagn.tag not in xmltaglist: 
      print tagn.tag 
      xmltaglist.append(tagn.tag) 
     else: 
      print 'tag exists: ' + str(tagn.tag) 
    return xmltaglist.sort() 

def processxmlfile(xmllist, xmltaglist): 
    seperator='^' 
    for fl in xmllist: 
     with open(fl) as f: 
      tree = etree.parse(f) 
      if 'anzmeta' in str(tree.getroot()): 
       log=open(rootDir+'\\'+log_name+'anzmeta_xml_log.txt','a') 
       log.write(':;:'+seperator+str(x)+seperator+fl+seperator) 
       print xmltaglist 
       for xmltag in xmltaglist: 
        if xmltag not in tree: 
         print str(xmltag)+"::DoesNotExist" 
         log.write(str(xmltag)+"::DoesNotExist"+seperator) 
        for element in tree.iter(xmltag): 
         #print element[x] 
         for child in element.getchildren(): 
          print "{0.tag}: {0.text}".format(child) 
          log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child).replace('\n','')+seperator) 
       log.write('^;:;\n') 
       log.close 
      else: 
       print fl+" not an anzlic metadata file...logging seperately" 
       log=open(rootDir+'\\'+log_name+'non_anzmeta_xml_log.txt','a') 
       log.write(':;:'+seperator+str(x)+seperator+fl+seperator) 
       for xmltag in xmltaglist: 
        for element in tree.iter(xmltag): 
         #print element[x] 
         for child in element.getchildren(): 
          print "{0.tag}: {0.text}".format(child) 
          log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child).replace('\n','')+seperator) 
       log.write('^;:;\n') 
       log.close 


locatexml(SourceDIR,x, rootDir,xmllist, xmltaglist) #run locate xml and process to get sorted list of all tags 
processxmlfile (xmllist, xmltaglist) 

回答

1

您可以按字母顺序输出标签::文本对。那么你将保证有一个一致的顺序,并且如果所有记录具有相同的一组标签,它们将以相同的顺序。

+0

问题是他们并不都具有相同的标签或相同的顺序。而不是在原始脚本中解析xml的内容,您怎么看待以下内容?阅读输出文本文件,创建一个包含输出文本文件中所有标签的数组,然后按字母顺序排列它们,然后遍历每行(创建一个新的文本文件),从中填充空白条目的数组中的标签他们不存在。 – GeorgeC 2013-03-08 03:32:04

+0

听起来很完美。 :) – 2013-03-08 03:33:36

相关问题