Google Appscript, извлекает API XML и получает дочерний элемент дочернего элемента

#xml #api #google-apps-script

#xml #API #google-apps-script

Вопрос:

Я немного застрял в работе с многоуровневым XML с помощью Google App Script.

Я выполняю выборку API XML с помощью команды UrlFetchApp.fetch(). Это работает. Формат XML выглядит следующим образом:

 <CALENDAR>
    <CalendarManager>
       <Categories>
            <Category Id="1" AuthorId="1234">
                <Author Legacy="True"></Author>
                <Name></Name>
                <LastUpdated></LastUpdated>
            </Category>
            <Category Id="2" AuthorId="1234">
                <Author Legacy="True"></Author>
                <Name></Name>
                <LastUpdated></LastUpdated>
                <Subcategories>
                    <Subcategory Id="1" AuthorId="1324">
                        <Author Legacy="True"></Author>
                        <Name></Name>
                        <LastUpdated></LastUpdated>
                    </Subcategory>
                    <Subcategory Id="2" AuthorId="1234">
                        <Author Legacy="True"></Author>
                        <Name></Name>
                        <LastUpdated></LastUpdated>
                    </Subcategory>
            </Category>
        </Categories>
    </CalendarManager>
</CALENDAR>
 

Вот основная часть моего кода. В настоящее время я могу получить информацию из категории, как вы можете видеть в моем фрагменте моего кода ниже. Моя проблема заключается в том, что каждая попытка, которую я предпринимал, захватить подкатегорию, если она существует, я не могу присвоить данные переменной.

 // Get Category Information 
var rAndCTypes = root.getChild('CalendarManager').getChild('Categories').getChildren('Category');  
  for (var r = 0; r < rAndCTypes.length; r  ) {
    var rAndC = rAndCTypes[r];
    var typeIdID =  rAndC.getAttribute('Id').getValue().replace(/['=Id]/g, "");
    var AuthorId =  rAndC.getAttribute('AuthorId').getValue().replace(/['=AuthorId]/g, "");
    var authorLegacy = rAndC.getContent(0).getValue();        
    var name = rAndC.getContent(1).getValue();
    var lastUpdated = rAndC.getContent(2).getValue();

  }
 

Любая помощь очень ценится, поскольку я провел весь день в тупике.

Ответ №1:

Вы должны получить следующего дочернего элемента с помощью getContent(3)

Чтобы избежать null дочерних элементов, используйте условное обозначение для подкатегорий раньше. Вот пример:

 var rAndCTypes = root.getChild('CalendarManager').getChild('Categories').getChildren('Category');  
  for (var r = 0; r < rAndCTypes.length; r  ) {
    var rAndC = rAndCTypes[r];
    var typeIdID =  rAndC.getAttribute('Id').getValue().replace(/['=Id]/g, "");
    var AuthorId =  rAndC.getAttribute('AuthorId').getValue().replace(/['=AuthorId]/g, "");
    var authorLegacy = rAndC.getContent(0).getValue();        
    var name = rAndC.getContent(1).getValue();
    var lastUpdated = rAndC.getContent(2).getValue();
    var subcategories = rAndC.getContent(3);

    if(subcategories) {
      subcategoriesChildren = subcategories.getChildren('Subcategory');
      for (var i = 0; i < subcategoriesChildren.length; i  ) {
        var sub = subcategoriesChildren[i];
        var subTypeIdID =  sub.getAttribute('Id').getValue().replace(/['=Id]/g, "");
        var subAuthorId =  sub.getAttribute('AuthorId').getValue().replace(/['=AuthorId]/g, "");
        var subAuthorLegacy = sub.getContent(0).getValue();        
        var subName = sub.getContent(1).getValue();
        var subLastUpdated = sub.getContent(2).getValue();
      }
    }
  }
 

Ссылка