2013-09-05 23 views
1

我無法將子元素添加到<result>標記。使用Google App腳本解析多級XML XmlService

代碼:

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()getText()方法正好。但是,如果我在定義條目後立即讓<result>這樣的特定元素的子元素與行var results = entries.getChildren();一起獲得運行時錯誤「TypeError:Can not find function getChildren in object [Element:]」。什麼deuce?

我不明白這裏發生了什麼(顯然)。 getRootElement()返回一個Element類型。 getChildren()返回元素數組。 entries在哪裏變成不是元素的東西,有沒有更好的方法來解析這個文件?我覺得我在這裏錯過了一些非常愚蠢的東西。

回答

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 
+0

謝謝你的時間。花了一段時間才弄清楚我在做什麼錯了。 getChildren返回和元素的ARRAY。即使單個元素仍然是1的數組。如果我已經用'var results = entries [0] .getChildren();替換了'var results = entries.getChildren();''我得到了我期待的行爲。 – mcenhillk

+0

很酷。請將此問題標記爲已接受/已關閉,以便這對其他人有用。 –