2016-05-19 9 views
1

助けてください。私は大きなXMLファイルを解析し、そのデータをCSVファイルに転送しようとしています。私はタグの間にたくさんのデータを失ってしまい、その理由を理解することはできません。ここでPython SAXパーサー

は、XMLの一部である:ここで

<testcase internalid="1256092" name="hls_vtt_single_default_diable_vtt"> 
    <node_order><![CDATA[7]]></node_order> 
    <externalid><![CDATA[6121]]></externalid> 
    <version><![CDATA[2]]></version> 
    <summary><![CDATA[<p>condition: single subtitle track is available in stream and it is default &nbsp;set the vtt track to diable status before playing stream.</p> 
<p>&nbsp;</p> 
<div>play stream no subtitle is rendered along with A/V<span class="Apple-tab-span" style="white-space:pre"> </span></div> 
<div>&nbsp;</div>]]></summary> 
    <preconditions><![CDATA[]]></preconditions> 
    <execution_type><![CDATA[1]]></execution_type> 
    <importance><![CDATA[2]]></importance> 
</testcase> 

私のPythonコードです:

class CaseHandler(xml.sax.ContentHandler): 
    def __init__(self): 
     self.CurrentData = "" 
     self.externalid = "" 
     self.version = "" 
     self.summary = "" 

    def startElement(self, tag, attributes): 
     self.CurrentData = tag 
     if tag == "testcase": 
      name = attributes["name"] 
      outfile.write("\n" + name + " ,") 

    def endElement(self, tag): 
     if self.CurrentData == "externalid": 
      outfile.write("OTV52-" + self.externalid + ",") 

     elif self.CurrentData == "version": 
      outfile.write("Version: " + self.version + ",") 

     elif self.CurrentData == "summary": 
      outfile.write("Summary: " + self.summary + ",") 

    def characters(self, content): 
     if self.CurrentData == "externalid": 
     self.externalid = content 
     elif self.CurrentData == "version": 
     self.version = content 
     elif self.CurrentData == "summary": 
     self.summary = content 

if (__name__ == "__main__"): 

    parser = xml.sax.make_parser() 
    parser.setFeature(xml.sax.handler.feature_namespaces, 0) 

    Handler = CaseHandler() 
    parser.setContentHandler(Handler) 

    parser.parse("OTV52.xml") 

問題は、それが「要約」括弧内の情報のいずれかを返さないことです。 externalidとバージョンのデータは正常終了します。しかし、 "要約"ブラケットから返されるのはdiv括弧です。

「条件:

は、私はそれを返す必要があります。単一の字幕トラックをストリームに利用可能であり、それは、ストリームを再生する前にディアブル状態にVTTトラックを設定し、デフォルト あり/なし字幕が一緒にレンダリングされていないストリーミング再生しますV "

答えて

0

このanswerに示されているように、characters()を呼び出すたびに、解析された値+=contentを連結してください。

import xml.sax 
import re 

class CaseHandler(xml.sax.ContentHandler): 
    def __init__(self): 
     self.CurrentData = "" 
     self.externalid = "" 
     self.version = "" 
     self.summary = "" 

    def startElement(self, tag, attributes): 
     self.CurrentData = tag 
     if tag == "testcase": 
      name = attributes["name"] 
      outfile.write("\r" + name + " ,") 

    def endElement(self, tag): 
     if self.CurrentData == "externalid": 
      outfile.write("OTV52-" + self.externalid + ",") 

     elif self.CurrentData == "version":   
      outfile.write("Version: " + self.version + ",") 

     elif self.CurrentData == "summary": 
      self.summary = re.sub("<[^>]+>", "", self.summary) 
      self.summary = re.sub("\n|&nbsp;|/\s\s/", "", self.summary).strip() 
      outfile.write("Summary: " + self.summary + ",") 

    def characters(self, content): 
     if self.CurrentData == "externalid": 
     self.externalid += content 
     elif self.CurrentData == "version": 
     self.version += content 
     elif self.CurrentData == "summary": 
     self.summary += content 

出力(すべて1行)

# 
# hls_vtt_single_default_diable_vtt ,OTV52-6121,Version: 2,Summary:   \ 
#   condition: single subtitle track is available in stream and it is \ 
#   default set the vtt track to diable status before playing   \ 
#   stream.play stream no subtitle is rendered along with A/V,  \ 
:しかし、正規表現置換を検討し、改行や空白を含め、解析されたCDATAでXMLコンテンツを削除します
関連する問題