Я работаю над форматом документов Open XML для листов excel.
var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]");
он должен возвращать все строки с формулами, но ничего не возвращает. Тот же xml в редакторе кислорода, когда применяется одно и то же выражение xpath, возвращает все из них.
Я копирую внутренний XML файл WorksheetXml, чтобы гарантировать, что контент тот же... знаете ли вы, почему С# не работает ожидаемым способом?
EDIT: проблема с пространством имен
Я добавил следующее:
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);
и это не сработало, я думаю, что это не проблема пространства имен.
Возможно ли, что редактор кислорода обрабатывает пространства имен по-разному? Я предполагаю, что элемент c
находится в пространстве имен, но вы не указываете его.
Смотрите этот очень похожий вопрос для примера кода - и если это не проблема, напишите более подробную информацию.
EDIT: код, который вы опубликовали, не использует пространство имен в 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
.)
(Обратите внимание, что нет необходимости использовать строковый литерал, если у вас нет обратных косых черт, а строка находится на одной строке.)
Вы не указали пространство имен OpenXML для узлов в выражении XPath. Все имеющиеся API.NET XPath, о которых я знаю, не наследуют пространства имен из контекста документа, поэтому, если вы явно не укажете его и не используете какие-либо префиксы в выражении XPath, оно рассматривается как пустое пространство имен.
Предполагая, что это вызов XmlNode.SelectNode
, вам нужна перегрузка с двумя аргументами, где второй аргумент XmlNamespaceManager
.