簡體   English   中英

使用Google Apps腳本中的命名空間解析XML

[英]Parsing XML with namespace in google apps script

我正在嘗試從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"/>

如果我獲得了root元素並查看了子元素,則使用以下代碼:

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')返回null。 我想這是因為我沒有按名稱空間引用它...

那么我應該怎么做才能獲得每個國家的獎牌信息? 感覺就像我接近了,但是這里有些東西我沒有在抱怨。

編輯:我想出了如何創建一個命名空間(我認為)。 我做了以下

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

Buuut ...我仍然從xml中提取null,這讓我非常惱火。

這個示例腳本怎么樣? 在此腳本中,您的xml數據已作為示例數據進行了測試。 為此,我在xml的末尾添加了</medals_by_country></medals> 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"
    }
]

參考:

如果我誤解了您的問題,對不起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM