2016-11-18 6 views
0

Excelで作業している特定の問題を解決するために、VBAとXMLの基礎を自分自身で教えようとしています。私はAPIを使って緯度/経度のセンサスブロックIDを取得しようとしています。ここでVBAを使用してhtmlを解析しようとしています

はXMLコードです:私は仕事に行くことができます

<Response xmlns="http://data.fcc.gov/api" status="OK" executionTime="120"> 
    <Block FIPS="120950170151016"> 
    <intersection FIPS="120950170151016"></intersection> 
    <intersection FIPS="120950170151019"></intersection> 
    <intersection FIPS="120950170151015"></intersection> 
    </Block> 
    <County FIPS="12095" name="Orange"></County> 
    <State FIPS="12" code="FL" name="Florida"></State> 
    <messages>FCC0001: The coordinate lies on the boundary of mulitple blocks, first FIPS is displayed. For a complete list use showall=true to display 'intersection' element in the Block</messages> 
    <head></head> 
</Response> 

のみVBAコマンドは

のように、私についたままhtmlコードのたくさんの値を与える

blockID = Doc.getElementsByTagName("Block")(0).innerText 

です

<Block FIPS="120950170151016"> 

私はgetAttributes関数(?)を使用する必要があるかもしれないと思われますが、そうではありません私はVBAを使用しているので、ドロップダウンのオプションとして表示されます。私は参照パッケージのいずれかがインストールされていないかどうか疑問に思います。

洞察?

編集:下の統計情報をありがとう。私はLoadXML()の代わりにLoad()を使用しようとしましたが、オブジェクトに情報を読み取っていないようです。エラーは "この操作を完了するために必要なデータはまだ利用できません"であり、コードがx値をループしようとすると発生します。 Localsビューアーからオブジェクトにデータがないことを確認します。私はあなたが行くような特性throught tranverse、あなたのコードをビルドするためにLocalsImmediateウィンドウを使用する方法を示して2つのアニメーションGIFを持ってVBA XML parsing - looping through child nodesに私の答えで

Dim oAttribute, item 
Dim x As Long 
Dim apiURLstub, apiURL As String 
apiURLstub = "http://data.fcc.gov/api/block/find?" 

'append lat/lon info to URL 
Dim lat As Double 
Dim lon As Double 

lat = Range("A3").Value 
lon = Range("B3").Value 
apiURL = apiURLstub & "latitude=" & lat & "&longitude=" & lon & "&showall=true" 

Dim objXML As Object, node As Object 
Set objXML = New MSXML2.DOMDocument 

If Not objXML.Load(apiURL) Then 'strXML is the string with XML' 
    Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason 

Else 
    Set node = objXML.getElementsByTagName("intersection") 
    For x = 0 To node.Length - 1 
     For Each oAttribute In node(x).Attributes 
      Debug.Print oAttribute.Value 
     Next 
    Next 

End If 
+0

XML!= HTML。代わりに[Microsoft.XMLDOM](https://msdn.microsoft.com/en-us/library/aa468547.aspx)を使用してください。 – Comintern

+0

[Regex](http://stackoverflow.com/a/1732454/1641172)を使ってみましたか? –

+0

XML。私のばかげた質問にお答えいただきありがとうございます! – jer312

答えて

0

を:ここで私が持っているものです。

enter image description here

Sub TestStub() 
    Dim oAttribute, item 
    Dim x As Long 
    Const XMLTEST = "<Response xmlns=""http://data.fcc.gov/api"" status=""OK"" executionTime=""120"">" & _ 
        "<Block FIPS=""120950170151016"">" & _ 
        "<intersection FIPS=""120950170151016""></intersection>" & _ 
        "<intersection FIPS=""120950170151019""></intersection>" & _ 
        "<intersection FIPS=""120950170151015""></intersection>" & _ 
        "</Block>" & _ 
        "<County FIPS=""12095"" name=""Orange""></County>" & _ 
        "<State FIPS=""12"" code=""FL"" name=""Florida""></State>" & _ 
        "<messages>FCC0001: The coordinate lies on the boundary of mulitple blocks, first FIPS is displayed. For a complete list use showall=true to display 'intersection' element in the Block</messages>" & _ 
        "<head></head>" & _ 
        "</Response>" 


    Dim objXML As Object, node As Object 

    Set objXML = CreateObject("MSXML2.DOMDocument") 

    If Not objXML.LoadXML(XMLTEST) Then 'strXML is the string with XML' 
     Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason 

    Else 
     Set node = objXML.getElementsByTagName("intersection") 
     For x = 0 To node.Length - 1 
      For Each oAttribute In node(x).Attributes 
       Debug.Print oAttribute.Value 
      Next 
     Next 

    End If 
End Sub 
+0

このコードをお寄せいただきありがとうございます。特にこの初心者にとっては非常に役に立ちます。 – jer312

+0

別のダムの質問をする危険があるので、私はVBAプログラムでURLからxmlデータを読み込むことができません。 LoadXML()の代わりにLoad()を使用しようとしましたが、オブジェクトに情報を読み取っているようには見えません。ここに私が持っているものがあります: – jer312

+0

更新されたポストを参照してください。いくつかの基本的な質問に答える時間をとってくれてありがとう。 – jer312

関連する問題