2013-03-08 43 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

相關問題