1

皆さん....これは、私が最近尋ねた同様の質問へのフォローアップです。構造をたどってすべての子ノードを反復せずに、XML 構造から特定の値を取得するにはどうすればよいですか? XPath を使用するよう提案されました。

次の単純化された XML 構造を想定します。

<MyWeather>
    <sensor location="Front Entry">
    <reading label="Temperature">
        <title>Front Entry</title>
        <label>Temperature</label>
        <value>54</value>
        <units>F</units>
        <lastUpdate>05/27/2013 12:23 AM</lastUpdate>
    </reading>
    <reading label="Humidity">
        <title>Front Entry</title>
        <label>Humidity</label>
        <value>66</value>
        <units>%</units>
        <lastUpdate>05/27/2013 12:23 AM</lastUpdate>
    </reading>
</sensor>
<sensor location="Patio">
    <reading label="Temperature">
        <title>Patio</title>
        <label>Temperature</label>
        <value>46</value>
        <units>F</units>
        <lastUpdate>05/27/2013 12:23 AM</lastUpdate>
    </reading>
    <reading label="Humidity">
        <title>Patio</title>
        <label>Humidity</label>
        <value>93</value>
        <units>%</units>
        <lastUpdate>05/27/2013 12:23 AM</lastUpdate>
    </reading>

    </sensor>
</MyWeather>

これが私の ASP ページの一部です。

<%
xmlDoc = CreateObject("Msxml2.DOMDocument")
xmldoc.setProperty ("ServerHTTPRequest", true)
xmlDoc.setProperty ("ProhibitDTD", False)
xmlDoc.validateOnParse = true

'    Filename is a sting variable containing the URL

xmlDoc.async = "False"
xmlDoc.load(FileName)

'    Error and return code processing done here but removed 

For Each el In xmldoc.childNodes
    if el.childnodes.length <> 0 then
    response.write ("<table align='center' class='auto-style1'>")
    for each el2 in el.childnodes
        Response.write("<tr><td>" & el2.getattribute("location") & "</td><td></td></tr>")
        for each el3 in el2.childnodes
            for each el4 in el3.childnodes
            if el4.nodename = "value" then 
            Response.write("<tr><td></td><td>" & el3.getattribute("label") & " " & el4.text & " " & el4.nextSibling.text & "</td></tr>")
            exit for
              end if
          next
          next
      next
    response.write ("</table>")
    end if
  Next
xmlDoc = Nothing

%>

私の質問は、「 For each el4 in ...」セクションのコードに関連しています。「値」が見つかるまで、子ノードを反復処理していることがわかります。次に、そのタグ値を出力します。次のタグがわかっているので (変更されるまでは)、nextsibling を使用してその値を取得する「ユニット」タグです。 このコードは機能します!

私が知りたいのは、私の反復プロセスなし で、センサーの位置読み取りラベルの任意の組み合わせに対して、これら 2 つのタグ値を直接取得する方法があるかどうかです。

探しているタグを見つけるために、50 を超える要素を反復処理する必要がある場合が他にもいくつかあります。

以前の質問の推奨事項に基づいて、この xPath コードを追加しました。これが機能する場合、上記の「for each el4 in el3.childnodes loop」が置き換えられます

xmlDoc.setProperty ("SelectionLanguage", "XPath")

                oNode = xmldoc.selectSingleNode("//reading[@label='Temperaure']/units")
                o2Node = xmldoc.selectSingleNode("//reading[@label='Temperaure']/value")
                if oNode is nothing or o2node is nothing then
                    Response.write("<tr><td></td><td> Nothing found for value or units </td><td>" & el3.getattribute("label") & "</tr>") 
                  else
                    Response.write("<tr><td></td><td>" & el3.getattribute("label") & " " & o2Node.text & " " & oNode.text & "</td></tr>")
                  end if    

しかし、それは私にはうまくいきませんでした。私はいくつかのバリエーションを試しました: @ 記号なしで、oNode ステートメントにフルパスを使用して、つまり /MyWeather/sensor/reading/...

空の oNode および/または O2Node のチェックは常に true です。

アイデアはありますか?.....RDK

4

1 に答える 1