2012-12-10 183 views
1

作爲一個背景位,我是一個相當新的編程人員。自從我上次'編碼'以來,這已經差不多10年了,所以請放輕鬆;)。使用VBA從XML中提取數據

林目前正試圖從下面的XML文件exctract數據:

- <IPNumber IPNumber="5"> 
- <Band Band="1"> 
- <Channel Channel="1"> 
    <CMPWRE>0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
- <Channel Channel="2"> 
    <CMPWRE>-0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
    </Band> 
- <Band Band="2"> 
- <Channel Channel="1"> 
    <CMPWRE>0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
    </Band> 
</IPNumber5> 
- <IPNumber IPNumber="6"> 
- <Band Band="1"> 
- <Channel Channel="1"> 
    <CMPWRE>0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
- <Channel Channel="2"> 
    <CMPWRE>-0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
    </Band> 
- <Band Band="2"> 
- <Channel Channel="1"> 
    <CMPWRE>0.123456</CMPWRE> 
    <CMPWIM>0.234567</CMPWIM> 
    </Channel> 
    </Band> 
</IPNumber6> 

目前IM希望用戶選擇IPnumber,信道和頻帶他們想要的..然後我想提取的CMPWRE &每個列表中像下面CMPWIM數據:

IPNumber 'X' 
Band  'X' 
Channel 'X' 
CMPWRE 'XXX' 
CMPWIM 'XXX' 

下面是一小段程式碼,即時通訊試圖用提取的數據,但我只是沒有得到任何運氣得到它的工作。

代碼:

Set oXML = CreateObject("MSXML.DOMDocument") 
oXML.async = False 
oXML.Load ("H:\14-13-21.xml") 


Dim LgChan As String 
Dim LgChan1 As String 
Dim LgChan2 As String 
**Dim LgChan3 As String 
Dim LgChan4 As String** 

Dim Test As Integer 
Dim Test2 As Integer 
Dim Test3 As Integer 

Test = mobelenum0.Value ' User Box on GUI where a value is inputted E.G. the number 5 
Test2 = FeedSubBand.Value ' User Box on GUI where a value is inputted E.G. the number 1 
Test3 = LogicChannel.Value ' User Box on GUI where a value is inputted E.G. the number 1 


LgChan = "TableContents/IPModuleNumber[@IPModuleNumber='1']" 
LgChan1 = "//TableContents/IPModuleNumber/FeederSubBand[@FeederSubBand=" & Test2 & "]" 
LgChan2 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]" 
**LgChan3 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]/CMPWRE" 
LgChan4 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]/CMPWIM"** 

Worksheets("sheet1").Range("B101").Value = oXML.DocumentElement.SelectSingleNode(LgChan).NodeTypedValue 
Worksheets("sheet1").Range("B102").Value = oXML.DocumentElement.SelectSingleNode(LgChan1).nodeTypedValue 
Worksheets("sheet1").Range("B103").Value = oXML.DocumentElement.SelectSingleNode(LgChan2).nodeTypedValue 
**Worksheets("sheet1").Range("B104").Value = oXML.DocumentElement.SelectSingleNode(LgChan3).nodeTypedValue 
Worksheets("sheet1").Range("B105").Value = oXML.DocumentElement.SelectSingleNode(LgChan4).nodeTypedValue** 

IM努力獲得的代碼,這樣,如果選擇了differend帶那麼很明顯的渠道價值將隨着IPNumber變化通過過濾下來改變......一樣了。

任何幫助將是偉大的!

Smerf

+1

您是否擁有對xml佈局的控制權?通過我的思維方式,是無效的XML。這不會幫助任何類型的解析器 – Chris

回答

0

你將需要補充的是捕捉「時,不同的頻段選擇」的事件代碼。 該代碼取決於用戶如何選擇的樂隊,但如果帶是從一個用戶窗體組合框選擇,你會趕上Combobox_Change事件,像這樣:

Private Sub FeedSubBand_Change() 
    DisplayBands 
End Sub 

編輯: 如果樂隊由用戶按一個執行按鈕來選擇,你應該使用該按鈕的Click事件,像這樣:

Private Sub ExecuteButton_Click() 
     DisplayBands 
End Sub 

正如你提到的,重要的是瞭解這裏的性能問題是很重要的。如果XML文件很大,閱讀需要很長時間。這樣做是一個好主意,只有在用戶通過按下按鈕特意詢問文檔時才能閱讀文檔。另一種選擇是每次更改一個文本框時自動讀取,但如果XML文檔很大,則這樣做不會很好。

+0

GTG,謝謝你的迴應。 用戶從用戶表單上的文本框輸入一個數字,所以我會修改你的建議,看看我能做什麼 – smerf

+0

GTG,感謝您的回覆。用戶首先將若干數字輸入到多個文本框中,然後單擊GUI上的「執行」按鈕。 ComboBox_change僅在操作過程中由用戶更改時纔有用? 即時通訊希望我能夠做這個任務幾乎是一個樹型視圖類型的搜索,但也許我可能需要從IPNumber「X」中提取所有的數據到內存,然後做一個子搜索帶「X」,然後加載所有的樂隊「X」導致記憶和重複...但這似乎非常記憶h and和過程'muncher'..這是我不希望發生的事情。 – smerf

+0

GTG。即時通訊處理大約30個XML文件,每個文件從1mb到3mb不等,因此我需要篩選大量的數據。 – smerf