Доступ к комментариям в XML с использованием XPath - PullRequest
45 голосов
/ 24 апреля 2009

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

Например:

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

Я хочу получить доступ к «Некоторому комментарию здесь».

Спасибо ...

РЕДАКТИРОВАТЬ: я использую MSXML DOM ActiveX, и команда comment (), кажется, не работает ... Есть идеи почему?

Ответы [ 4 ]

57 голосов
/ 24 апреля 2009

С дорожкой

/foo/bar/comment()

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

19 голосов
/ 24 апреля 2009

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

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

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

Редактировать

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

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

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

3 голосов
/ 24 апреля 2009

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

Используя выражение XPath, предложенное @ Anthony , я смог успешно загрузить узел комментария с помощью следующей функции 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 найденного узла. Помните, что SelectSingleNode всегда возвращает IXmlNode, и вам нужно запросить его data или text свойств.

1 голос
/ 24 апреля 2009

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

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

Наклонился отсюда текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...