получение нулевого элемента при чтении kml [duplicate]

Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.

Для Ex:

SqlConnection connection = null;
connection.Open();

Когда вы запускаете это кода, вы получите:

System.NullReferenceException: Object reference not set to an instance of an object.

Вы можете избежать этой ошибки, например, следующим образом:

if (connection != null){
    connection.Open();
}

Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.

29
задан Jean-Philippe Leclerc 28 April 2011 в 14:22
поделиться

4 ответа

Когда используются пространства имен, они также должны использоваться в запросе XPath. Ваш запрос XPath будет работать только с элементами без пространства имен (как это можно проверить, удалив пространство имен из вашего XML).

Вот пример, показывающий, как вы создаете и передаете менеджер пространства имен:

var xml = ... XML from your post ...;

var xmlReader = XmlReader.Create( new StringReader(xml) ); // Or whatever your source is, of course.
var myXDocument = XDocument.Load( xmlReader );
var namespaceManager = new XmlNamespaceManager( xmlReader.NameTable ); // We now have a namespace manager that knows of the namespaces used in your document.
namespaceManager.AddNamespace( "prefix", "http://www.MyNamespace.ca/MyPath" ); // We add an explicit prefix mapping for our query.

var result = myXDocument.XPathSelectElement(
    "//prefix:Plugin/prefix:UI[1]/prefix:PluginPageCategory[1]/prefix:Page[1]/prefix:Group[1]/prefix:CommandRef[2]",
    namespaceManager
); // We use that prefix against the elements in the query.

Console.WriteLine(result); // <CommandRef ...> element is printed.

Надеюсь, это поможет.

25
ответ дан abatishchev 24 August 2018 в 15:40
поделиться

Существует способ сделать это без каких-либо изменений в xpath. Решение, которое я нашел, заключается в удалении пространства имен при анализе XML в XDocument.

Вот пример:

var regex = @"(xmlns:?[^=]*=[""][^""]*[""])";
var myXDocument = XDocument.Parse(Regex.Replace("MyXmlContent", regex, "", RegexOptions.IgnoreCase | RegexOptions.Multiline))

Теперь, когда пространство имен исчезло, его легче манипулировать.

-2
ответ дан Jean-Philippe Leclerc 24 August 2018 в 15:40
поделиться

Вероятно, это комментарий к сообщению @ Cumbayah, но я не могу оставлять комментарии ни о чем.

Возможно, вам лучше использовать что-то вроде этого вместо того, чтобы использовать XmlReader для получения nametable .

var xml = ... XML from your post ...;
var myXDocument = XDocument.Parse(xml);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("prefix", "http://www.MyNamespace.ca/MyPath");

var result = ...;
14
ответ дан mdonoughe 24 August 2018 в 15:40
поделиться

Самый простой способ в вашем случае - использовать оси XPath и узел для определения имени и позиции узла для выбора элемента. Ваш выбор XPath:

myXDocument.XPathSelectElement("//Plugin/UI[1]/PluginPageCategory[1]/Page[1]/Group[1]/CommandRef[2]", myXDocument.Root.CreateNavigator());

Можно легко перевести на:

myXDocument.XPathSelectElement("/child::node()[local-name()='Plugin']/child::node()[local-name()='UI'][position()=1]/child::node()[local-name()='PluginPageCategory'][position()=1]/child::node()[local-name()='Page'][position()=1]/child::node()[local-name()='Group'][position()=1]/child::node()[local-name()='CommandRef'][position()=2]");

Нет необходимости создавать и передавать XmlNamespaceManager в качестве параметра.

3
ответ дан Yannis Stereo 24 August 2018 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: