Почему выражение XPath не возвращает никаких результатов в C #, но делает это вне C #? - PullRequest
2 голосов
/ 08 июля 2009

Я работаю над форматом документов Open XML для листов Excel.

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]");

он должен возвращать все строки с формулами, но ничего не возвращает. Один и тот же xml в Oxygen Editor, когда применяется одно и то же выражение xpath, возвращает их все.

Я копирую внутренний XML-файл WorksheetXml, чтобы обеспечить одинаковое содержимое ... Знаете ли вы, почему C # не работает ожидаемым образом?


РЕДАКТИРОВАТЬ: проблема пространства имен

Я положил это:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable);
manager.AddNamespace(string.Empty, @"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
manager.AddNamespace("r", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships");

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]", manager);

и это не сработало, я думаю, что это не проблема пространства имен.

Ответы [ 2 ]

3 голосов
/ 09 июля 2009

Возможно ли, что Oxygen Editor по-разному обрабатывает пространства имен? Я предполагаю, что элемент c находится в пространстве имен, но вы не указываете его.

См. этот очень похожий вопрос для примера кода - и если это не проблема, пожалуйста, опубликуйте больше деталей.

РЕДАКТИРОВАТЬ: Код, который вы опубликовали, по-прежнему не использует пространство имен в XPath. Попробуйте это:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable);
manager.AddNamespace("n", 
    "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
manager.AddNamespace("r",  
    "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

var nodeList = WorksheetXml.SelectNodes("//n:c[child::n:f]", manager);

(Я не знаю, в каком пространстве имен должны быть элементы c и f - настройте их соответствующим образом.)

(Обратите внимание, что нет необходимости использовать буквальный строковый литерал, когда у вас нет обратной косой черты, а строка находится в одной строке.)

0 голосов
/ 09 июля 2009

Вы не указали пространство имен OpenXML для узлов в выражении XPath. Все стандартные API .NET XPath, о которых я знаю, не наследуют никаких пространств имен из контекста документа - поэтому, если вы не укажете это явно и не используете никаких префиксов в выражении XPath, он будет рассматриваться как пустое пространство имен.

Предполагая, что это вызов XmlNode.SelectNode, вам нужна перегрузка с двумя аргументами, где второй аргумент - XmlNamespaceManager.

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