Путь текущего узла в XDocument - PullRequest
4 голосов
/ 06 мая 2011

Можно ли получить путь текущего XElement в XDocument?Например, если я перебираю узлы в документе, есть ли какой-то способ, которым я могу получить путь этого узла (XElement), чтобы он возвращал что-то вроде \ root \ item \ child \ currentnode?

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Нет ничего встроенного, но вы можете написать свой собственный метод расширения:

public static string GetPath(this XElement node)
{
    string path = node.Name.ToString();
    XElement currentNode = node;
    while (currentNode.Parent != null)
    {
        currentNode = currentNode.Parent;
        path = currentNode.Name.ToString() + @"\" + path;
    }
    return path;
}


XElement node = ..
string path = node.GetPath();

Хотя это не учитывает положение элемента в его группе пиров.

1 голос
/ 06 мая 2011

В зависимости от того, как вы хотите использовать XPath. В любом случае вам нужно подойти к самому себе и собрать XPath в пути.

Если вы хотите иметь читаемую строку для отображения - просто объединение имен узлов prent (см. Предложение BrokenGlass) работает нормально

Если вы хотите выбрать позже в XPath

  • позиционный XPath (укажите положение каждого узла в его родительском элементе) - это одна опция (что-то вроде / / [3] / *). Вы должны рассматривать атрибуты как особый случай, поскольку для атрибутов не определен порядок
  • XPath с предопределенными префиксами (пространство имен для префикса необходимо хранить отдельно) - / my: root / my: child [3] / o: prop1 / @ t: attr3
  • XPath со встроенными пространствами имен, когда вы хотите получитаемый и переносимый XPath / * [name () = 'root' & namespace-uri () = 'http://my.namespace']/.... (см. Спецификации для функций name и namespace-uri http://www.w3.org/TR/xpath/#function-namespace-uri)

Обратите внимание, что специальные узлы, такие как комментарии и инструкции по обработке, возможно, придется учитывать, если вы хотите действительно общую версию XPath для узла внутри XML.

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