#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 проблема была решена