2013-02-08 3 views
1

Я искал способ анализа и редактирования XML с помощью скрипта Google Apps. Анализ данных с использованием встроенного класса Xml достаточно прост, но это не позволяет мне редактировать какие-либо данные. Возьмем, например, пример XML:Анализ и редактирование XML с помощью скрипта Google Apps

<?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 в строку) в объект ,

Есть ли у кого-нибудь какие-либо предложения по этому поводу, было бы с благодарностью оценено.

ответ

2

В случае, если кто считает, что это в будущем (привет будущих людей, как это летающие машины и роботы-горничные?), Я не был в состоянии найти способ для синтаксического анализа и редактирования 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; 
} 
+0

+1 для роботов-горничных! Будет ли 'Utilities.jsonStringify()' не выполнять работу 'xmlToJson()'? – Mogsdad

+0

Я получаю «TypeError: не могу найти функцию getName в объекте XmlDocument». во второй строке – Snowball

Смежные вопросы