Xmlnode, как узнать, существует ли узел или нет

Мне нужна помощь, чтобы проверить, существует ли узел.

Я могу выбрать узел следующим образом

node["sa:name1"]["sa:name2"]["sa:name3"]

И это отлично работает, но если узел не существует, я получаю сообщение об ошибке, я пробовал это

if(node.SelectSingleNode("/sa:name1/sa:name2/sa:name3") != null)

но это не помогло, это просто делает новую ошибку

Исключение типа «System.Xml.XPath.XPathException» возникло в System.Xml.dll, но не было обработано в пользовательском коде.

Дополнительная информация: необходим диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или определяемую пользователем функцию.


person user2378036    schedule 12.06.2014    source источник


Ответы (3)


Используйте http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.addnamespace.aspx

XmlNamespaceManager nsMgr = new XmlNamespaceManager(node.OwnerDocument.NameTable);

nsMgr.AddNamespace("sa", "http://example.com/");

XmlNode selected = node.SelectSingleNode("/sa:name1/sa:name2/sa:name3", nsMgr);
if (selected != null)
{
  ...
}

Вместо http://example.com/ вам, конечно, нужно использовать URI узлов во входном документе, я думаю, что URI пространства имен - http://rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/.

person Martin Honnen    schedule 12.06.2014
comment
Здравствуйте, Мартин. Я почти уверен, что мне нужно использовать этот URI 'rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/' Но теперь, когда я пытаюсь выбрать один узел, я всегда получаю null? - person user2378036; 12.06.2014
comment
Попробуйте http://rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/ без имени файла. - person Martin Honnen; 12.06.2014
comment
Спасибо за помощь, но я только что попробовал это, и это ничего не меняет. - person user2378036; 12.06.2014
comment
Пожалуйста, отредактируйте свой вопрос и предоставьте образец ввода XML, показывающий объявленные там пространства имен. - person Martin Honnen; 12.06.2014
comment
нашел этот пост stackoverflow.com/questions/6950032/ мне нужно было './' перед моим xpath для выбора из текущего узла. но в остальном спасибо, это мне очень помогло. - person user2378036; 12.06.2014

Ошибка ясна: вам нужно добавить диспетчер пространства имен в свой код, чтобы ваш запрос xpath работал. Используйте перегруженную версию SelectSingleNode(), которая принимает экземпляр XmlNamespaceManager в качестве аргумента.

  XmlDocument doc = new XmlDocument();
  doc.Load("booksort.xml");

  //Create an XmlNamespaceManager for resolving namespaces.
  XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
  nsmgr.AddNamespace("bk", "urn:samples");

  //Select the book node with the matching attribute value.
  XmlNode book;
  XmlElement root = doc.DocumentElement;
  book = root.SelectSingleNode("descendant::book[@bk:ISBN='1-861001-57-6']", nsmgr);

  Console.WriteLine(book.OuterXml);

http://msdn.microsoft.com/en-us/library/h0hw012b%28v=vs.110%29.aspx

person Oscar    schedule 12.06.2014

Перед вызовом SelectSingleNode вам нужно добавить диспетчер пространства имен для документа:

XmlNamespaceManager xmlnsMan = new XmlNamespaceManager(xml.NameTable);
xmlnsMan.AddNamespace("sa", "[namespace]);
person DGibbs    schedule 12.06.2014