===关于结束问题的评论====
虽然示例中的数据已本地化,但最终脚本对于拥有一组复杂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,status等],然后运行并创建另一个只有文本的数据集。
我将强调这不是本地化的,因为该解决方案适用于任何需要解构的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: georgec@atgis.com.au
#
# 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)
答案 0 :(得分:1)
您可以按字母顺序输出标签::文本对。然后,您将保证具有一致的排序,如果所有记录都具有相同的标记集,则它们的顺序将相同。