1

Google Apps Script を使用して XML を解析および編集する方法を探していました。組み込みの Xml クラスを使用してデータを解析するのは簡単ですが、これではデータを編集できません。たとえば、XML の例を見てみましょう。

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='&quot;Xh9QE00OESt7I2Bp&quot;'>
<id>http://www.google.com/m8/feeds/profiles/domain/test.com/full/user</id>
<info>Test Info</info>
</entry>

情報エントリを変更しようとしているとします。現在、すべてを文字列として保持し、 を使用indexOf("<info>")してエントリの開始位置を見つけ、そこからテストを に置き換えていindexOf("</info>")ます。これは機能しているように見えますが、それほど信頼できるとは思いません (タグに属性がある場合、それを見つけることができません)。

ここで別のスレッドを見て、属性を変更するために XML (Xml ではない) を使用することを誰かが提案しましたが、既存の xml (UrlFetchApp で文字列に取得) をオブジェクトに解析する方法がわかりません。

これについて何か提案はありますか?

4

1 に答える 1

2

将来誰かがこれを見つけた場合に備えて (こんにちは未来の人、空飛ぶ車とロボットのメイドはどうですか?)、apps スクリプトで xml を解析および編集する方法を見つけることができなかったので、独自の json を xml に書きました。私のために働いた機能(GoogleプロファイルAPIからのデータの処理)。私はそれを他であまりテストしていないので、それらを使用したい場合はおそらくそれらを変更する必要があります.

function xmlToJson(xmlElement) {
  var e = {"namespace" : xmlElement.getName().getNamespace(),
           "name" : xmlElement.getName().getLocalName()};
  var xmlAs = xmlElement.getAttributes();
  if(xmlAs.length > 0) {
    e.attributes = {};
    for(var j = 0; j < xmlAs.length; j++) {
      e.attributes[xmlAs[j].getName().getLocalName()] = {"namespace" : xmlAs[j].getName().getNamespace(),
                                                         "name" : xmlAs[j].getName().getLocalName(),
                                                         "value" : xmlAs[j].getValue()};
    }
  }

  var xmlChildren = xmlElement.getElements();
  if(xmlChildren.length > 0) {
    e.children = {};
    for(var i = 0; i < xmlChildren.length; i++){
      var child = xmlToJson(xmlChildren[i]);
      if(typeof e.children[child.name] != "undefined")
        e.children[child.name].push(child);
      else
        e.children[child.name] = [child];
    }
  } else {
    e.value = xmlElement.getText();
  }
  return e;
}

function jsonToXmlString(json) {
  var xml = "<?xml version='1.0' encoding='UTF-8'?>";
  var namespaces = new Object(); // List of things which are possibly namespaces
  namespaces["http://www.w3.org/2000/xmlns/"] = "xmlns";

  function appendNode(node) {
    if(typeof node.attributes != 0) {
      var attributes = ""; // Get attributes first incase any are namespaces
      var keys = getKeys(node.attributes);
      for(var i = 0; i < keys.length; i++) { // Loop through attributes once to get namespaces
        if(node.attributes[keys[i]].value.indexOf("http") == 0) // Possible namespace, store in namespaces
          namespaces[node.attributes[keys[i]].value] = node.attributes[keys[i]].name;
      }
      // If we only do one loop, there may be some namespaces on attributes that don't get recorded first
      for(var i = 0; i < keys.length; i++) { 
        if(node.attributes[keys[i]].namespace != "") // Get namespace if needed
          var ns = (namespaces[node.attributes[keys[i]].namespace] || node.attributes[keys[i]].namespace) + ":";
        else
          var ns = "";
        attributes += " " + ns + node.attributes[keys[i]].name + "='" + node.attributes[keys[i]].value + "'"; 
      }
    }
    if(node.namespace != "") // Get namespace if needed
      var ns = (namespaces[node.namespace] || node.namespace) + ":";
    else
      var ns = "";

    xml += "<" + ns + node.name + attributes;

    if(typeof node.children != "undefined") { 
      xml += ">";
      var cKeys = getKeys(node.children);
      for(var i = 0; i < cKeys.length; i++) {
        for(var j = 0; j < node.children[cKeys[i]].length; j++)
          appendNode(node.children[cKeys[i]][j]);
      }
    } else if(typeof node.value != "undefined") {
      xml += ">" + node.value;
    } else {
      xml += "/>";
      return
    }

    xml += "</" + ns + node.name + ">"
  }

  appendNode(json);
  return xml;
}
于 2013-02-15T09:07:26.143 に答える