XPath: как выбрать узел по его атрибуту?

у меня есть XML, который выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<colors>
  <color index = "0">#FF0000</color>
  <color index = "1">#FF0200</color>
  <color index = "2">#FF0300</color>
  <color index = "3">#FF0500</color>
  [..]

Я пытаюсь выбрать узел по его индексу:

XmlDocument ColorTable = new XmlDocument();
ColorTable.Load(HttpContext.Current.Server.MapPath("~/App_Data/ColorTable.xml"));
int percentage = 2;
string xpath = string.Format(@"//color[index={0}]", percentage.ToString());
//string xpath = string.Format(@"//color[index=""{0}""]", percentage.ToString());
//string xpath = string.Format(@"//color[index='{0}']", percentage.ToString());
var r = ColorTable.SelectSingleNode(xpath).Value;

Я пробовал также прокомментированные версии, но он не возвращает никакого результата. Есть предложения?

2 ответов


использовать //color[@index='{0}'] вместо. Знак @ означает "атрибут".

Я отмечаю, что вы используете дословный строковый литерал кстати-знак @ в старт строки. В этом случае нет необходимости - у вас нет обратной косой черты в строке, и она не является многострочной. Вам также не нужно явно вызывать ToString on percentage - он будет преобразован автоматически.

string xpath = string.Format("//color[@index='{0}']", percentage);

кстати, для тех из нас, кто не говорит на родном XPath,есть много онлайн XPath "игровые площадки" это позволяет вам писать выражения XML и XPath и просматривать результаты в интернете.

всякий раз, когда я оказался в "XPath ад" Я обычно хожу в те детские площадки и попробуйте различные комбинации, пока я не получу свои (необходимые) результаты, по какой-то причине он работает быстрее, чем писать тестовую программу C# / Python или даже запускать их раздутый так называемые редакторы XML.