0

次の形式のxmlを使用して、NOAAソースから温度データをGoogleスプレッドシートに解析しようとしています:

..... <parameters applicable-location="point1">
<temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n7-1">
<name>Daily Maximum Temperature</name>
<value>63</value>
<value>72</value>
<value>76</value>
<value>78</value>
<value>74</value>
<value>62</value>
<value>58</value>
</temperature>
<temperature type="minimum" units="Fahrenheit" time-layout="k-p24h-n6-2">
<name>Daily Minimum Temperature</name>
<value>52</value>
<value>58</value>
<value>56</value>
<value>60</value>
<value>48</value>
<value>45</value>
</temperature>
</parameters>
</data>
</dwml>

最大見出しと最小見出しの両方のタグ内の各数値を、スプレッドシートの個別のセルに配置したいと思います。私の現在のスクリプトは次のとおりです。

function Temperatures() { var text = UrlFetchApp.fetch("http://graphical.weather.gov/xml/SOAP_server/ndfdXMLclient.php?whichClient=NDFDgen&lat=38.99&lon=-77.01&listLatLon=&lat1=&lon1=&lat2=&lon2=&resolutionSub=&listLat1=&listLon1=&listLat2=&listLon2=&resolutionList=&endPoint1Lat=&endPoint1Lon=&endPoint2Lat=&endPoint2Lon=&listEndPoint1Lat=&listEndPoint1Lon=&listEndPoint2Lat=&listEndPoint2Lon=&zipCodeList=&listZipCodeList=&centerPointLat=&centerPointLon=&distanceLat=&distanceLon=&resolutionSquare=&listCenterPointLat=&listCenterPointLon=&listDistanceLat=&listDistanceLon=&listResolutionSquare=&citiesLevel=&listCitiesLevel=&sector=&gmlListLatLon=&featureType=&requestedTime=&startTime=&endTime=&compType=&propertyName=&product=time-series&begin=2004-01-01T00%3A00%3A00&end=2017-04-12T00%3A00%3A00&Unit=e&maxt=maxt&mint=mint&Submit=Submit").getContentText();
return parse(text);
function parse(text) {
var doc = Xml.parse(text, true);
var temps = doc.dwml.data.getElement("parameters").getElement("temperature").getElements("value").getText();
return temps
}
}

ただし、このスクリプトを実行すると、最初のタグである 63 という 1 つの読み値のみがセルに解析されます。.getElement(“value”).getText(); を変更すると .getElements(“value”).getText(); に 次のエラー メッセージが表示されます:「TypeError: 関数 getText がオブジェクトに見つかりません。」</p>

あなたが提供できるアドバイスをありがとう。

ロン

4

2 に答える 2

1

最初に .getElements("value") を呼び出して要素を配列に読み込み、次に結果配列とそれぞれから getText をループします。

var doc = Xml.parse(text, true);
var temps = [];  // temps will be an array
temps = doc.dwml.data.getElement("parameters").getElement("temperature").getElements("value");
for (var i=0; i < temps.length; i++)
{
  var value = temps[i].getText();
  // do something with the value..
  Logger.log(value);
}
于 2013-04-16T03:15:01.323 に答える
1

これは古い投稿ですが、素晴らしい答えが見つかりませんでした。以下は、新しい XmlService を使用して適切に機能し、反復して任意の深さの子を取得するスクリプトのペアです。

function XMLtoAssocArray(xmlString) {
  var xml = XmlService.parse(xmlString)
  var root = xml.getRootElement()
  return XMLhelper(root)
}


function XMLhelper(Element){
  var children = Element.getChildren()
  var out = {}
  if(children.length>0){
    for (var ii = 0; ii<children.length; ii++){
      var child = children[ii]
      var name = child.getName();
      out[name] = XMLhelper(child)
    }
  } else {
    out = Element.getText()
  }
  return out
}

于 2017-01-13T07:38:29.887 に答える