#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» будет неявно включать «.» . Это немного странно…