=== 締めくくりの質問に対するコメント ====
例のデータはローカライズされていますが、プロセスは属性に関係なく任意の入力 xml で機能するため、複雑な xml ファイルのセットをテキスト データベースに変換する場合は、最終的なスクリプトが役立ちます。
=== 新しい情報 ==== 最初のプロセスですべてのタグのリストを生成できましたが、数千の xml を実行する必要があるため、tag::text のペアを再作成することは現実的ではありません。一意のソート済みリストを作成し、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^;:;
(この場合、^ は列区切り記号で、:: は tag::テキスト区切り記号です)
[citeinfo、timeprd、status など] のようなタグのリストを取得し、テキストだけを含む別のデータセットを実行して作成するために必要です。
ソリューションは分解が必要な xml で機能するため、これはローカライズされていないことを強調します。
===元の質問が続きます
さまざまな xml スタイル ドキュメントを作成して、テキスト ファイルを作成しました。各ファイルにはタグの順序がわずかに異なるため、tag::text をまとめて記録しました。キーは、元の xml ファイルの名前です。
すべてのファイルの列が適切に並べられるように、データから Excel または 'csv' を再構築することは可能ですか。
Excel のサンプルと生データはこちらから入手できます。使用したスクリプトはこちらです。
ありがとう、
==== 出力からタグのリストを取得するのは困難です。1 行ずつ行ってタグを検索し、重複していない場合はリストに追加する必要があるためです。そこで、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)