91771


GAS を使ってブログの更新を見張って通知するようなプログラムを作ろうと思ってます

* * *

<https://web.plus-idea.net/2018/04/google-apps-script-xmlservice-parse/>

こちらを参考にして外部サイトのページ内容を取得することはできたんですが  
XmlService というライブラリによるxml のパースがうまくいかず  
要素を取り出せずに困っています

取得した内容は

[code]

    <rdf>
      <channel></channel>
      <item><link></link><title></title></item>
      <item><link></link><title></title></item>
        :
    </rdf>
    
[/code]

という形式になっていて相手サイトに何度もアクセスするのもよくないと思い  
上記のようなフォーマットのヒアドキュメントで動かしているんですが  
rootDoc.getChildren() の length が０になって子要素が取得できません

namespace というのがあまりよくわかっていないんですが  
rootDocの中身を表示すると

[code]

    [Element: <rdf:RDF [Namespace: http://www.w3.org/1999/02/22-rdf-syntax-ns#]/>]
    
[/code]

となっているのでブログの見様見真似で namespace のURLを指定してみましたがうまくいきません  
気になるのは [] でかこまれてるので rootDoc 自体が配列になっている？  
ようにもみえるんですがその中身を取り出す方法もわからず困っています

以下テストコードです

[code]

    function myFunction() {
      const content = `
    <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns:atom="http://www.w3.org/2005/Atom" xml:lang="ja">
      <channel rdf:about="http://google.com">
        ...
      </channel>
      <item rdf:about="http://google.com">
        <link>http://google.com</link>
        <title>タイトル</title>
      </item>
      <item rdf:about="http://google.com">
        <link>http://google.com</link>
        <title>タイトル</title>
      </item>
    </rdf:RDF>
    `
    
      var xmlDoc = XmlService.parse(content);
      var rootDoc = xmlDoc.getRootElement();
      Logger.log(rootDoc);
      var ns = XmlService.getNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 
      var items = rootDoc.getChildren('item', ns);
      Logger.log(items.length);
      for(var i = 0; i < items.length; i++) {
        console.log(items[i].getText());
        var title = items[i].getChild("title").getText();
        var url = items[i].getChild("link").getText();
        var text = title + ' ' + url;
        Logger.log(text);
      }
    }
    
[/code]

実行結果

[code]

    20:51:22    お知らせ    実行開始
    20:51:23    情報  [Element: <rdf:RDF [Namespace: http://www.w3.org/1999/02/22-rdf-syntax-ns#]/>]
    20:51:23    情報  0.0
    20:51:24    お知らせ    実行完了
    
[/code]


CC BY-SA 4.0
2022-10-23T11:55:40.033
91764
2022-10-23T15:26:31.143
2022-10-23T15:26:31.143
3054
question
javascript google-apps-script xml
GAS で xml の指定要素を取り出したい


対象の XML 文書の名前空間は、`xmlns="http://purl.org/rss/1.0/"`
と宣言されています。これが接頭辞の無いタグに適用される名前空間になるはずです。

よって、`getChildren` で使っている名前空間の取得にはこれを使います。

[code]

    var ns = XmlService.getNamespace("http://purl.org/rss/1.0/")
    
[/code]

他に `getChild` を用いている場所もこの `ns` を使えば動くはずです。


CC BY-SA 4.0
2022-10-23T15:25:36.147
91771
2022-10-23T15:25:36.147
3054
91764
answer