1

システムは python 2.7.2 で dom パーサーを使用します。目標は、.db ファイルを抽出し、SQL サーバーで使用することです。現在、sqlite3 ライブラリに問題はありません。XMLファイルの解析中に欠落している要素を処理する方法について、同様の質問/回答を読みましたが、それでも解決策がわかりませんでした。xml には 15000 以上の要素があります。xml の基本的なコードは次のとおりです。

<topo>
   <vlancard>
      <id>4545</id>
      <nodeValue>21</nodeValue>
      <vlanName>voice</vlanName>
   </vlancard>
   <vlancard>
      <id>1234</id>
      <nodeValue>42</nodeValue>
      <vlanName>camera</vlanName>
   </vlancard>
   <vlancard>
      <id>9876</id>
      <nodeValue>84</nodeValue>
   </vlancard>
</topo>

3 番目の要素のように、いくつかの要素にはノードがありません。これにより、要素番号に矛盾が生じます。すなわち

from xml.dom import minidom
xmldoc = minidom.parse('c:\vlan.xml')
vlId = xmldoc.getElementsByTagName('id')
vlValue = xmldoc.getElementsByTagName('nodeValue')
vlName = xmldoc.getElementsByTagName('vlanName')

モジュールを実行した後:

IndexError: list index out of range
>>> len(id)
16163
>>> len(vlanName)
16155

この問題により、要素の順序付けに問題が発生します。table を印刷している間、パーサーは欠落している要素を渡し、要素の順序が混同されます。単純な while ループを使用して、値をテーブルに挿入します。

x=0
while x < (len(vlId)):
    c.execute('''insert into vlan ('id','nodeValue','vlanName') values ('%s','%s','%s') ''' %(id[x].firstChild.nodeValue, nodeValue[x].firstChild.nodeValue, vlanName[x].firstChild.nodeValue))
    x= x+1

他にどうすればこれを行うことができますか? どんな助けでも大歓迎です。

ユスフ

4

1 に答える 1

2

xml 全体を解析してから挿入する代わりに、各 vlancard を解析して ID/値/名前を取得し、DB に挿入します。

于 2011-07-15T13:52:54.180 に答える