1

<result>タグの子要素にアクセスできません。

コード:

var xml = '\
  <document>\
    <currentTime>2013-09-05 09:47:06</currentTime>\
    <result>\
      <one>2013-09-05 09:47:06</one>\
      <two>2013-09-20 14:30:13</two>\
      <three>2013-09-02 14:12:22</three>\
      <four>2505</four>\
    </result>\
    <cachedUntil>2013-09-05 10:28:40</cachedUntil>\
  </document>';

var document = XmlService.parse(xml);
var entries = document.getRootElement().getChildren();
Logger.log(entries.length);
for (var i = 0; i < entries.length; i++) {
  Logger.log("%s -> %s",entries[i].getName(),entries[i].getText());
}

このコードを実行すると、予想どおり、ロガーに次のものが返されます。

[13-09-05 13:54:18:815 EAT] 3.0
[13-09-05 13:54:18:815 EAT] currentTime -> 2013-09-05 09:47:06
[13-09-05 13:54:18:816 EAT] result ->                                       
[13-09-05 13:54:18:816 EAT] cachedUntil -> 2013-09-05 10:28:40

getName()3 つの要素を取得し、 andgetText()メソッドを問題なく実行できます。ただし、エントリを定義した直後<result>の行のように、特定の要素の子を取得しようとすると、実行時エラー「TypeError: オブジェクト [Element: ] に関数 getChildren が見つかりません」が発生します。var results = entries.getChildren();何のデュース?

ここで何が起こっているのかわかりません(明らかに)。getRootElement()Element タイプを返します。getChildren()要素の配列を返します。entries要素ではないものに変わっているのはどこですか?このドキュメントを解析するより良い方法はありますか? ここで本当にばかげたことを見逃しているように感じます。

4

1 に答える 1

1

getChildren()子を持つ要素のみを呼び出すことができます。それはあなたが何をしようとしているのかによって異なりますが、ここにあなたが望むものを引き出す単純な再帰関数があります -

キーチェックはelements[i].getContentSize() > 1

function startTraversing() {
  var xml = '\
  <document>\
    <currentTime>2013-09-05 09:47:06</currentTime>\
    <result>\
      <one>2013-09-05 09:47:06</one>\
      <two>2013-09-20 14:30:13</two>\
      <three>2013-09-02 14:12:22</three>\
      <four>2505</four>\
    </result>\
    <cachedUntil>2013-09-05 10:28:40</cachedUntil>\
  </document>';

 var document = XmlService.parse(xml); 
 logChildren(document.getRootElement().getChildren());

}

function logChildren(elements){
 Logger.log(elements.length);
 for (var i = 0; i < elements.length; i++) {
  Logger.log("%s -> %s",elements[i].getName(),elements[i].getText());
  if(elements[i].getContentSize() > 1){
    var children = elements[i].getChildren();
    logChildren(children);
  }
 } 
}

これは出力されます -

[13-09-05 09:12:55:781 EDT] 3.0
[13-09-05 09:12:55:781 EDT] currentTime -> 2013-09-05 09:47:06
[13-09-05 09:12:55:782 EDT] result ->                             
[13-09-05 09:12:55:782 EDT] 4.0
[13-09-05 09:12:55:783 EDT] one -> 2013-09-05 09:47:06
[13-09-05 09:12:55:783 EDT] two -> 2013-09-20 14:30:13
[13-09-05 09:12:55:783 EDT] three -> 2013-09-02 14:12:22
[13-09-05 09:12:55:784 EDT] four -> 2505
[13-09-05 09:12:55:784 EDT] cachedUntil -> 2013-09-05 10:28:40
于 2013-09-05T13:18:30.147 に答える