Синтаксический анализ JS XML: значение не меняется

#javascript #xml

#javascript #xml

Вопрос:

Я разбираю XML с помощью Javascript. Мой XML выглядит следующим образом:

 <?ml version="1.0" encoding="UTF-8">
<IPC_XML>
<dfr>
<dfr>
<data>
<analog>
    <channel index="0">
        <label>Channel 1</label>
    </channel>
    <channel index="1">
        <label>Channel 2</label>
    </channel>
</analog>
</data>
</dfr>
</dfr>
</IPC_XML>
  

Игнорируйте странную структуру (вне моего контроля). Я запускаю этот JS-код:

 function updateAnalogCfgValues (xmlDoc) {
var analogCfgs = xmlDoc.selectNodes ("//channel");
var cfg = analogCfgs.nextNode ();
var cnt = 1;

while (cfg !== null) {
    var node = document.getElementById ("aChan" cnt);
    var tmp = document.createElement ("b");
    tmp.innerText = cfg.selectSingleNode ("//label").text;
    node.appendChild (tmp);

    cfg = analogCfgs.nextNode (); cnt  ;
}
}
  

Когда я смотрю на материал в отладчике, все кажется прекрасным. Я вижу, что cfg переменная меняется, и я вижу, что ее первым дочерним элементом является <label> элемент, значение которого также меняется. Проблема в том, что когда я смотрю на HTML, все, что я вижу, это ‘Channel 1’, повторяющийся снова и снова. Этот текст никогда не меняется. Есть идеи?

РЕДАКТИРОВАТЬ: Есть ли вероятность, что мой selectSingleNode вызов теперь «обновляется» (за неимением лучшего термина)?

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

1. Первое, что я бы попробовал, это изменить // label на / label — но я не могу проверить, поэтому я не уверен, является ли это ответом или нет…

2. С помощью ‘/label’ я получаю исключение для нулевого объекта, не имеющего свойства text.

Ответ №1:

Просмотр руководства по XPath и получение некоторой помощи от коллеги привели к ответу. Мне нужно, чтобы моя строка поиска была .//Label . При этом выбирается мой текущий узел канала, а затем выполняется поиск узла метки. Раньше это был просто поиск по всему документу для первого узла label, поэтому ничего не изменилось.

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

1. Это было мое первоначальное предположение (что оно направлялось в корень) — но я предположил, что «cfg.SelectSingleNode» будет неявно включать «.» . Это немного странно…