【问题标题】:Parsing XML with namespace in google apps script在谷歌应用程序脚本中使用命名空间解析 XML
【发布时间】:2018-02-10 20:39:52
【问题描述】:

我正在尝试从 SportsRadar api 解析 XML 并检索有关奥运会每个国家/地区奖牌的信息。 API 似乎正在使用命名空间,我不太清楚如何解析 XML。

如果我查看 XML 的顶部,它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<medals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.sportradar.com/sportsapi/v1/winterolympics" generated_at="2017-12-03T12:23:38+01:00" xsi:schemaLocation="http://schemas.sportradar.com/sportsapi/v1/winterolympics http://schemas.sportradar.com/bsa/winterolympics/v1/xml/endpoints/winterolympics/medals.xsd">
  <medals_by_country>
    <medal_info country="Slovenia" country_code="SLO" ioc_code="SLO" total_ranking="1" gold_ranking="1" total="24" gold="14" silver="3" bronze="7"/>
    <medal_info country="Canada" country_code="CAN" ioc_code="CAN" total_ranking="2" gold_ranking="1" total="17" gold="9" silver="5" bronze="3"/>
    <medal_info country="Germany" country_code="GER" ioc_code="GER" total_ranking="3" gold_ranking="1" total="19" gold="8" silver="6" bronze="5"/>

如果我得到根元素并查看子元素,我会使用以下代码:

var xml_root = xmlData.getRootElement()
Logger.log( xml_root.getChildren() )

并得到这个输出:

[18-02-10 15:29:52:056 EST] [[Element: <medals_by_country [Namespace: http://schemas.sportradar.com/sportsapi/v1/winterolympics]/>], [Element: <medals_by_sport [Namespace: http://schemas.sportradar.com/sportsapi/v1/winterolympics]/>]]

所以看看文档,getChildText(name, namespace) 似乎是我根据国家信息获得奖牌的神奇门票。所以我尝试:

var tst = xml_root.getChildText('medals_by_country', 'http://schemas.sportradar.com/sportsapi/v1/winterolympics');

但我收到一条错误消息,告诉我“找不到方法 getChildText(string,string)”。我正在解析这意味着命名空间不应该作为字符串传递,也许?但我无法弄清楚它应该作为什么传递。

我尝试通过以下方式获取第一个国家/地区信息:

xml_root.getChild('medals_by_country').getChildren('medal_info');

xml_root.getChild('medals_by_country') 返回空值。我想这是因为我没有通过命名空间引用它......

那么我应该怎么做才能获得每个国家/地区的奖牌信息?感觉就像我很接近,但有些东西我没有在这里摸索。

编辑: 我想出了如何创建一个命名空间(我认为)。我做了以下

var ns = XmlService.getNamespace("xsi", "http://schemas.sportradar.com/sportsapi/v1/winterolympics");

Buuut...我仍在从 xml 中提取空值,这让我很懊恼。

【问题讨论】:

    标签: xml google-apps-script


    【解决方案1】:

    这个示例脚本怎么样?在此脚本中,您的 xml 数据作为样本数据进行了测试。为此,我在 xml 末尾添加了&lt;/medals_by_country&gt;&lt;/medals&gt;medal_info 的值可以通过getAttributes() 检索。

    示例脚本:

    function myFunction(){
      var xml = '<?xml version="1.0" encoding="UTF-8"?><medals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.sportradar.com/sportsapi/v1/winterolympics" generated_at="2017-12-03T12:23:38+01:00" xsi:schemaLocation="http://schemas.sportradar.com/sportsapi/v1/winterolympics http://schemas.sportradar.com/bsa/winterolympics/v1/xml/endpoints/winterolympics/medals.xsd"><medals_by_country><medal_info country="Slovenia" country_code="SLO" ioc_code="SLO" total_ranking="1" gold_ranking="1" total="24" gold="14" silver="3" bronze="7"/><medal_info country="Canada" country_code="CAN" ioc_code="CAN" total_ranking="2" gold_ranking="1" total="17" gold="9" silver="5" bronze="3"/><medal_info country="Germany" country_code="GER" ioc_code="GER" total_ranking="3" gold_ranking="1" total="19" gold="8" silver="6" bronze="5"/></medals_by_country></medals>';
      var xmlData = XmlService.parse(xml);
      var xml_root = xmlData.getRootElement();
      var res = [];
      var c1 = xml_root.getChildren();
      for (var i in c1) {
        var c2 = c1[i].getChildren();
        for (var j in c2) {
          var c3 = c2[j].getAttributes();
          var temp = {};
          for (var k in c3) {
            temp[c3[k].getName()] = c3[k].getValue();
          }
          res.push(temp);
        }
      }
      Logger.log(JSON.stringify(res))
    }
    

    结果:

    [
        {
            "country": "Slovenia",
            "country_code": "SLO",
            "ioc_code": "SLO",
            "total_ranking": "1",
            "gold_ranking": "1",
            "total": "24",
            "gold": "14",
            "silver": "3",
            "bronze": "7"
        },
        {
            "country": "Canada",
            "country_code": "CAN",
            "ioc_code": "CAN",
            "total_ranking": "2",
            "gold_ranking": "1",
            "total": "17",
            "gold": "9",
            "silver": "5",
            "bronze": "3"
        },
        {
            "country": "Germany",
            "country_code": "GER",
            "ioc_code": "GER",
            "total_ranking": "3",
            "gold_ranking": "1",
            "total": "19",
            "gold": "8",
            "silver": "6",
            "bronze": "5"
        }
    ]
    

    参考:

    如果我误解了你的问题,我很抱歉。

    【讨论】:

    • 您不仅完全理解了我的问题,而且还使它与我的有限示例 XML 一起工作。谢谢你,我真的很感激。这是我的第一个 js 实验,你真的帮助我理解了这个过程。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2021-05-03
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多