C # XmlNodeReader исключение NodeType не поддерживается - PullRequest
0 голосов
/ 27 ноября 2010

Я получаю исключение, что NodeType "None" не поддерживается при попытке запустить следующий код.

public int ObjectContentI(string XmlPath)
{
    XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath));
    return xnr.ReadElementContentAsInt();
}

this.xmlr - это XmlDocument с успешно загруженным в него документом.XmlPath содержит действительный URL-адрес XPath.

Как мне установить NodeType (xnr.NodeType только для чтения) или я делаю что-то еще неправильно?

Часть моего XML:

<?xml version="1.0" encoding="utf-8" ?>
<ship weapons="0">
  <cost>
    <metal>250</metal>
    <crystal>100</crystal>
  </cost>
  <health>
    <shields>750</shields>
    <sregene>10</sregene>
    <hitpoints>1000</hitpoints>
    <oxygen cps="2">25000</oxygen>
  </health>

Мой XPath: "/ ship / health / shields / text ()"

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

Хорошо, ваш подход верен, но не полностью.

Предположим,

XmlNode n = myXMLDoc.SelectSingleNode("/ship/health/shields/");

n.InnerXML ИЛИ n.InnerText должно дать вам то, что вам нужно.

0 голосов
/ 27 ноября 2010

Несмотря на то, что conqenator предоставил вам код, который исправил вашу проблему, следующие причины объясняют, почему она не сработала:

Если вы не вызываете метод Read в XmlNodeReader или любом из классовкоторый происходит от XmlReader, вы всегда получите XmlNodeType.None NodeType, который является причиной ошибки.Чтобы исправить предоставленный вами код и вернуть int, код должен выглядеть следующим образом:

public int ObjectContentI(string XmlPath)
{
    int result;
    using(XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath))){
        while(xnr.Read()){
            result = xnr.ReadElementContentAsInt();
        }
    }
    return result;
}

Обратите внимание, что XPath для получения этой работы должен измениться на /ship/health/shields, так как ReadElementContentAsInt()возвращает содержимое элемента и не будет работать на текстовом узле, который вы получаете при использовании /ship/health/shields/text().

Обратите внимание, что я также обернул XmlNodeReader в блок использования, который избавится отXmlNodeReader, как только вы закончите, чтобы освободить ресурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...