XmlDocument.SelectSingleNode возвращает ноль для корневого узла

2

У меня есть несколько xml файлов, postfix которых не является .xml, но .component Теперь я хочу обрабатывать их в программе С#, но кажется, что С# can not даже нашел корневой элемент этих xml файлов

var doc = new XmlDocument();
doc.Load(path); // MG: edited to Load based on comment
XmlNode root = doc.SelectSingleNode("rootNodename");

Кажется, что корень равен нулю. Как мне с этим справиться?

  • 0
    Здесь может быть несколько проблем, я сомневаюсь, что это расширение файла. Вы смотрели на «doc» в отладчике и убедились, что он не загружается?
  • 0
    Вы можете опубликовать первые несколько строк одного из этих файлов XML?
Теги:
file-extension

3 ответа

5
Лучший ответ

Учитывая, что вы решили путаницу Load/LoadXml, я ожидаю, что проблема будет пространством имен; у вас есть пример xml? Обработка xml с пространствами имен получает... "fun"; -p

Например:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<test xmlns='myFunkyUri' value='abc'/>");
    // wrong; no namespace consideration
    XmlElement root = (XmlElement)doc.SelectSingleNode("test");
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value"));
    // right
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("x", "myFunkyUri"); // x is my alias for myFunkyUri
    root = (XmlElement)doc.SelectSingleNode("x:test", nsmgr);
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value"));

Обратите внимание, что даже если ваш xml объявляет псевдонимы xml, вам все равно придется повторно объявить их для своего диспетчера пространств имен.

  • 0
    Да, на самом деле есть некоторые интересные проблемы с пространством имен по умолчанию (без префикса)
4

LoadXml принимает строку XML, а не путь к файлу. Вместо этого попробуйте загрузить Load. Загрузка не касается расширения файла.

Вот ссылка на документацию для загрузки: http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx

  • 0
    Да, я допустил ошибку, когда написал вопрос. На самом деле я тоже попробовал Load (), LoadXml сгенерирует исключение, а Load () загрузит файл без проблем, но я просто не могу найти корневой узел, возвращаемое значение всегда равно нулю
  • 0
    На самом деле, я ожидаю, что настоящая проблема - это пространства имен ...
0

У меня была эта проблема: попробуйте сделать это перед установкой rootNodename Вместо этого: XmlNode root = doc.SelectSingleNode( "rootNodename" );

Сделайте это: XmlNode root = doc.SelectSingleNode( "/rootNodename" );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню