#c# #xml
#c# #xml
Вопрос:
В некоторых других вопросах задавался вопрос о том, как использовать Xpath для запроса XML-документов с пространством имен по умолчанию. Ответ заключается в том, чтобы использовать диспетчер пространств имен для создания псевдонима для пространства имен по умолчанию и использовать этот псевдоним в ваших xpaths.
Однако, что, если вы заранее не знаете URI пространства имен по умолчанию? Как вы узнаете это из XML-документа?
Комментарии:
1. Теоретически, вы должны знать пространство имен, иначе у вас не будет бизнеса, разбирающего XML-файл в первую очередь. Практически я знаю, что вы имеете в виду. Какой механизм вы используете для анализа XML?
2. Я использую System.Xml.XmlDocument
Ответ №1:
var doc = XDocument.Parse(myXml);
XNamespace ns = doc.Root.GetDefaultNamespace();
Ответ №2:
Если вы используете XmlDocument, вы можете получить пространство имен по умолчанию, проверив namespaceURI корневого элемента:
var document = new XmlDocument();
document.LoadXml("<root xmlns='http://java.sun.com/xml/ns/j2ee'></root>");
var defaultNamespace = document.DocumentElement.NamespaceURI;
Assert.IsTrue(defaultNamespace == "http://java.sun.com/xml/ns/j2ee");
Комментарии:
1. Я считаю, что это неверно.
document.DocumentElement.NamespaceURI
просто возвращает пространство имен корневого элемента. Это вполне может быть пространство имен, присоединенное к некоторому префиксу вместо пространства имен по умолчанию. Например.<xsd:root xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Ответ №3:
Вы можете попробовать использовать XmlNamespaceManager.DefaultNamespace
, чтобы получить его.
http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.defaultnamespace.aspx
Ответ №4:
Я знаю, что это старая тема, но у меня была та же проблема, используя класс XmlDocument, поскольку я хотел знать пространство имен по умолчанию и пространство имен с префиксом.
Я мог бы получить оба пространства имен, используя один и тот же метод.
string prefixns = element.GetNamespaceOfPrefix("prefix");
string defaultns = element.GetNamespaceOfPrefix("");
кажется, это работает для меня, получая оба пространства имен в XmlElement.
Редактировать: это метод XmlNode, поэтому он также должен работать с атрибутами
Ответ №5:
Самый простой способ сделать это
XmlDocument xDoc = new XmlDocument();
xDoc.Load(uriPath);
Console.WriteLine(xDoc.NamespaceURI);