2013-08-04 66 views
0

我有以下代碼下載文件的XBRL到谷歌電子表格谷歌腳本xml獲取父?

function XBRLexplore() { 
var ss = SpreadsheetApp.openById("0Aiy1DTQRndx6dFZLVDJfRnptbmRFUTM2S2lnUlRfWWd"); 
var Sheet = ss.getSheetByName("Sheet1"); // Activate sheet 
var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml"; 
var pageTxt = UrlFetchApp.fetch(target).getContentText(); 
var xbrl = Xml.parse(pageTxt,true).getElement() 
var test=xbrl.getElements(); 

var output=[]; 
for (var i=0;i<test.length;i++){ 
    var element=test[i] 
    var f=[element.contextref,element.id,element.unitref,element.decimals,e=element.Text] 
    output[i]=f; 
} 

Sheet.getRange(1,1,test.length,5).setValues(output); 

}

這將由5列下降約1700行到谷歌電子表格。

但是,我希望對象「xbrl」中的所有子元素都添加到每個元素旁邊。

例如:目前,聯排1421是如下數據:

D2013Q2QTD Fact-456FCC569047499F03F61D8FBE559EC1 shares -3 133973000

我希望它看起來像這樣: us-gaap WeightedAverageNumberOfDilutedSharesOutstanding D2013Q2QTD Fact-456FCC569047499F03F61D8FBE559EC1 shares -3 133973000

添加命名空間us-gaapWeightedAverageNumberOfDilutedSharesOutstanding在第2列

這將是很好,如果每個元素我可以使用某種getParent()函數然後只是堅持它在循環過程中的前2列。

我試圖使用getNamespace()循環裏的每個元素,但它給我一個錯誤

var ff=element.getNamespace()

回答

1

我不很瞭解如何確定需要的節點,但是,確定他們之後,你可以做你需要的第2列如下:

... 
    var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml"; 
    var pageTxt = UrlFetchApp.fetch(target).getContentText(); 
    var xbrl = XmlService.parse(pageTxt); 
    var element = xbrl.getRootElement().getChildren()[1420]; 
    Logger.log(element.getNamespace().getPrefix()); // us-gaap 
    Logger.log(element.getName()); // WeightedAverageNumberOfDilutedSharesOutstanding 
    ... 

新服務使用XmlService訪問,相較於老服務,簡單地CALLE d Xml

UPDATE

我與XmlService經驗少,也不太清楚,如果你可以使用通配符搜索節點,一個非常基本的例子,大概低效可以是:

... 
    var ns = 'us-gaap'; 
    var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml"; 
    var pageTxt = UrlFetchApp.fetch(target).getContentText(); 
    var xbrl = XmlService.parse(pageTxt); 
    var elements = xbrl.getRootElement().getChildren(); 
    var el, attr; 
    for (var element = 0, len = elements.length; element < len; ++element) { 
    el = elements[element]; 
    if (el.getNamespace().getPrefix() === ns) { 
     /* YOUR CODE */ 
     Logger.log(ns); 
     Logger.log(el.getName()); 
     attr = el.getAttribute('contextRef'); 
     if(attr) Logger.log(attr.getValue()); 
    } 
    } 
    ... 
+0

我m希望從所有節點獲取所有內容。你是怎樣做的?感謝您指出新的與舊的XML服務。我沒有意識到這一點。 – jason

+0

你可以使用通配符嗎?我如何得到'us-gaap'命名空間相關的元素? – jason

+0

最後一個問題。謝謝你的幫助。這是有幫助的。它涉及到「contextRef」屬性。在上面的例子中,上面例子的屬性就像「D2012Q2」。我知道這是在文檔的某個地方定義的。我如何看待contextref? – jason