Узнайте URI пространства имен по умолчанию из XML-документа на C#

#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);