2017-08-10 31 views
2

Google Apps Scriptの属性でXMLノードを見つける簡単な方法はありますか?ここではXMLの抜粋だ:どのようなガスは考えてはXmlServiceの目的のための「名前」である間、私が解析しようとしているXMLファイルの目的のためにGoogle Apps Script XmlService - 属性別検索

<hd:components> 
    <hd:text name="ADM Custom admissions TE"> 
     <hd:prompt>Admission</hd:prompt> 
     <hd:columnWidth widthType="minimum" minWidth="100"/> 
    </hd:text> 
    <hd:text name="ADM Insufficient heat end date TE"> 
     <hd:prompt>To</hd:prompt> 
    </hd:text> 
    <hd:text name="ADM Insufficient heat start date TE"> 
     <hd:prompt>From</hd:prompt> 
    </hd:text> 
    <hd:text name="ADM Third party payment period TE"> 
     <hd:defMergeProps unansweredText="__________"/> 
     <hd:prompt>When (date or period)?</hd:prompt> 
    </hd:text> 

、「名前」属性は、一意の識別子です。 Element.getChild(name)メソッド(このスニペットに示されている各ノードの "text")は、ノードタイプの一意でない分類子です。私はname属性だけでこのXMLファイルから特定のノードを検索する関数を書くことができるようにしたいと思います。他の言語のXMLPath表記法では、この機能に[@表記法を使用します。 GASでそれを行う方法はありますか、または、正しい名前の属性を持つノードを見つけるまでXMLを通る関数を書く必要がありますか、XMLの場合は高速検索のために別のタイプのデータ構造に格納しますファイルは十分に大きいですか?

私が書いたスニペットは次のとおりです。組み込み関数がないとうまくいきました。これを行うためのより良い/より速い方法があるかどうかは不思議でした。私の関数はそれほど効率的ではなく、XmlServiceがより効率的な内部データ構造を持っていれば、検索速度を上げることができますか?私のアプローチは、一致するまで要素のすべての子をループすることです。

function getComponentFromXML(xml,name) { 
    for (var i = 0; i < xml.length; i++) { 
    var x = xml[i]; 
    var xname = x.getAttribute('name').getValue(); 
    if (xname == name) { 
     return getComponentAttributes(x); 
    } 
    } 
} 
+0

[ドキュメント](https://developers.google.com/apps-script/reference/xml)を既に確認しましたか? XmlServiceとその属性に関するGoogle Apps Scriptの-service /) – KENdi

+0

私はそうしましたが、属性に基づいて検索するために既に定義されているメソッドは見ませんでした。それは大きな機能ではありません。特に、Xpathや他のXML実装でさまざまな言語で利用できるように、非標準化されていない非最適化の方法について心配しています。 – Quinten

答えて

0

唯一の方法は、属性 'name'の値が望ましいものを探している要素のリストを読み取ることです。 elementsが通過検索する要素の配列である場合は、

var searchResults = elements.filter(function (e) { 
    return e.getAttribute('name') && e.getAttribute('name').getValue() == searchString; 
}); 

を行うことができます(どちらのチェックは全くの「name」属性が存在しない場合にエラーを回避するために必要とされる。)

などを入手する方法配列elementsはXML文書に依存することがあります。あなたの例のように、検索する要素はルート要素の直接の子である、場合、

var doc = XmlService.parse(xmlString); 
var elements = doc.getRootElement().getChildren(); 

は、これを行うために迅速かつ簡単な方法だろう。

一般に、再帰なしですべての要素を取得するには、getDescendantsメソッドを使用できます。 ElementオブジェクトにフィルタリングできるContentオブジェクトの配列を返します。

var elements = doc.getDescendants().filter(function (c) { 
    return c.getType() == XmlService.ContentTypes.ELEMENT; 
}).map(function (c) { 
    return c.asElement(); 
}); 
関連する問題