2012-12-10 132 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