Проблема с браузером Internet Explorer / MS Edge при перемещении XML-данных

#javascript #html #xml #xml-parsing

#javascript #HTML #xml #синтаксический анализ xml

Вопрос:

Я пытаюсь просмотреть фрагмент XML, чтобы извлечь некоторые логические правила для веб-приложения. Мне удалось заставить мой JavaScript работать в Firefox, Chrome, Opera и Safari, но я получаю консольные ошибки в браузерах MS с указанием «Невозможно получить свойство «длина» неопределенной или нулевой ссылки«.

Я не могу найти решение методом проб и ошибок, поскольку ошибка появляется в начале кода.

Пример моего Javascript;

 function conditionTrigger(id, callType) {
    var parser = new DOMParser(),
    xmlLogic = parser.parseFromString(configXML, "text/xml"),
    tags = xmlLogic.getElementsByTagName('*'),
    conditionsPassed = 0,
    callType;
    if (id.length >= 3) {
        id = id.slice(3);
    }
    console.log(tags[0]);
    console.log(tags[0].children.length);
    console.log('ID to be checked against = '   id);
    console.log(tags.length   ' nodes.');
    console.log(tags[0].children.length   ' level 1 node children.');
    for(var i01 = 0; i01 < tags[0].children.length; i01   ){
        console.log(tags[0].children[i01]);
        if (tags[0].children[i01].nodeName == "Rules"){
        console.log(tags[0].children[i01].children.length   ' child nodes of '  tags[0].children[i01].nodeName   '.');
        for(var i02 = 0; i02 < tags[0].children[i01].children.length; i02  ){
            console.log(tags[0].children[i01].children[i02]);
        }
        }
    }
}
  

Мой xml приведен ниже;

 <?xml version="1.0" encoding="utf-8" ?>
<output brand="[BRANDNAME]" title="[SCRIPTNAME]" version ="[SCRIPTVERSION]">
<Rules>
 <block id="1000000" triggerID="14">
  <ConditionsAndActions name="Test for something else" setIndex="2">
   <Conditions>
    <Condition type="DataField"  fieldID="6" value="xxx" />
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="DisplayAlert" message="can't move on, xxx found"/>
   </Actions>
  </ConditionsAndActions>
  <ConditionsAndActions name="Check if forename is 'test' and call is a callback" setIndex="1">
   <Conditions>
    <Condition type="DataField"  fieldID="6" value="test" />
    <Condition type="Callback" />
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="27"/>
    <Action actionIndex="0" type="DisplayAlert" message="Aha, this is a callback!"/>
   </Actions>
  </ConditionsAndActions>
  <ConditionsAndActions name="Default" setIndex="0">
   <Conditions>
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="17"/>
   </Actions>
  </ConditionsAndActions>
 </block>
 <block id="1000001" triggerID="19">
  <ConditionsAndActions name="Default" setIndex="0">
   <Conditions>
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="18"/>
   </Actions>
  </ConditionsAndActions>
 </block>
 <block id="1000002" triggerID="20">
  <ConditionsAndActions name="Default" setIndex="0">
   <Conditions>
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="10"/>
   </Actions>
  </ConditionsAndActions>
 </block>
 <block id="1000003" triggerID="22">
  <ConditionsAndActions name="Default" setIndex="0">
   <Conditions>
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="10"/>
   </Actions>
  </ConditionsAndActions>
 </block>
 <block id="1000004" triggerID="23">
  <ConditionsAndActions name="Default" setIndex="0">
   <Conditions>
   </Conditions>
   <Actions>
    <Action actionIndex="0" type="MoveToPanel" panelID="17"/>
   </Actions>
  </ConditionsAndActions>
 </block>
</Rules>
</output> 
  

Комментарии:

1. Можете ли вы определить элементы, которые вы ищете в своем XML? Начиная с getElementsByTagName('*') кажется странным способом доступа к данным, поскольку он выбирает все элементы. И если вам нужен корневой элемент, к которому вы, похоже, пытаетесь получить доступ, tags[0] я бы просто использовал xmlLogic.documentElement . С этого момента я не уверен, к каким элементам вы хотите получить доступ, но я уверен, что querySelector(All) и getElementsByTagName позволит вам назвать тип элементов, которые вы хотите.

2. Кроме того, Stackoverflow позволяет вам вставлять ваши фрагменты HTML и Javascript в исполняемый, проверяемый способ, подумайте о том, чтобы вставить фрагмент в ваш вопрос, который мы можем проверить и протестировать в IE или Edge для выявления проблемы.

3. Элементы будут меняться по мере того, как xml несет конфигурацию для веб-приложения — в основном, в этом случае пользователь, нажимающий кнопку, передаст идентификатор, и JS необходимо просмотреть xml, чтобы выяснить, какие условия и действия относятся к этому идентификатору, затем выполнить тот, у которого наибольшее значение setIndex, если всеусловия выполнены, если не выполнено ни одно установленное условие, будет запущен defsult (setIndex = 0) и будут запущены связанные с ним действия

Ответ №1:

Я обнаружил, что путем изменения .children на .childNodes и getAttribute для использования jquery.attr проблема была решена