Подтвердить что ты не робот

Доступ к комментариям в XML с помощью XPath

Как получить доступ к комментариям внутри XML-документа с помощью XPath?

Например:

<table>
<length> 12 </length>
<!--Some comment here-->
</table>

Я хочу получить доступ к "Некоторый комментарий здесь".

Спасибо...

EDIT: Я использую MSXML DOM ActiveX, и комментарий команды() кажется неудачным... Любая идея, почему?

4b9b3361

Ответ 1

С помощью пути

/foo/bar/comment()

вы можете выбрать все комментарии в элементе /foo/bar. Конечно, зависит от вашего языка выбора. Но обычно это так, как вы это делаете.

Ответ 2

Используйте функцию comment(), например: -

/table/length/following::comment()[1]

выбирает первый комментарий, следующий за элементом длины.

Edit

Manoj спрашивает в комментарии к этому ответу, почему это не работает в MSXML. Причина в том, что вы используете MSXML3. По умолчанию MSXML3 не использует XPath в качестве языка выбора, по умолчанию используется более слабый язык (шаблон XSL). Вы должны установить XPath в качестве языка выбора с помощью метода DOMDocument setProperty. Например (в JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0");
dom.setProperty("SelectionLanguage", "XPath");

Теперь ваш полный язык XPath будет работать в ваших запросах (обратите внимание, что одно изменение прерывания - это предикаты индексатора, основанные на XPath, в то время как они основаны на 0 в XSL-шаблоне).

Ответ 3

На основе комментариев OP к опубликованным ответам (и мое любопытство относительно того, почему эта простая вещь не сработает), вот мое предложение:

Используя выражение XPath, предложенное @Anthony, я смог успешно загрузить комментарий node со следующей функцией JS:

function SelectComment(s)
{
  var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
  if (xDoc)
  {
    xDoc.loadXML(s);
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]");
    if (selNode != null)
      return selNode.text;
    else
      return "";
  }
}

Образец вызова:

SelectComment("<table><length> 12</length><!--Some comment here--></table>");

Вывод:

"Some comment here"

Примечания:

а. Версия MSXML может отличаться. Пожалуйста, используйте соответствующую информацию.

б. Этот тип кода определенно не рекомендуется, поскольку он работает только в IE. Однако, поскольку это ваше явно заявленное требование, я использовал объект ActiveXObject.

с. Вы не упомянули в своих комментариях, что не удается в предлагаемых выражениях XPath. Я предполагаю, что вы не запрашиваете свойство text извлеченного node. Имейте в виду, что SelectSingleNode всегда возвращает IXmlNode, и вам нужно запросить его свойства data или text.

Ответ 4

Возможно, эта помощь поможет, Этот образец удаляет комментарии

XmlNodeList list = xmlDoc.SelectNodes("//comment()");
foreach(XmlNode node in list)
node.ParentNode.RemoveChild(node);

Отстало отсюда текст ссылки