Как обрабатывать, когда элемент XML не имеет значения - PullRequest
1 голос
/ 19 марта 2009

Иногда определенный XMLElement имеет значение:

<CAR>value</CAR>

иногда, хотя это не относится к повторно используемому XML:

<CAR/>

При использовании XmlReader я пока не уверен, как справиться с этой ситуацией. Например, у меня есть код, который читает каждый элемент. Но что, если автомобиль не имеет ценности возвращаться время от времени? Затем мой DateTime.Parse бомбит, так что я не совсем уверен, что нужно по существу справиться с этими ситуациями и пропустить его с помощью XmlReader:

reader.ReadStartElement("CAR");
// error here since car doesn't have a value this time
_tDate = DateTime.Parse(reader.ReadContentAsString());

EDIT:

if(!reader.IsStartElement())

Это тоже не работает. После того, как он видит, что это не начальный элемент, я получаю сообщение об ошибке и не уверен, как обработать его, пропустив его по существу после оператора if

if(!reader.IsStartElement())
                    {
                        reader.ReadStartElement("CAR");
                        _tDate = DateTime.Parse(reader.ReadContentAsString());

                    }
                    reader. ReadEndElement(); <-- ERROR HERE not sure how to move on

РЕДАКТИРОВАТЬ 2:

Как я могу стать правдой, если значение <CAR/>

           reader.ReadStartElement("In");
            _optedInDate = DateTime.Parse(reader.ReadContentAsString());
            _userIsOut = false;
            reader.ReadEndElement();

            if(reader.IsStartElement("CAR"))
            {
                reader.ReadStartElement("CAR");
                _optedOutDate = DateTime.Parse(reader.ReadContentAsString());
                _userIsOptedOut = true;

            }

            reader.ReadStartElement("COLUMNS");
            reader.ReadStartElement("COLUMN");

Это явно НЕ начальный элемент, но я понял ...

РЕДАКТИРОВАТЬ 3:

пробовал это:

                if((reader.NodeType == XmlNodeType.Element) & (!reader.IsEmptyElement))
                {
                    reader.ReadStartElement("CAR");
                    _optedOutDate = DateTime.Parse(reader.ReadContentAsString());
                    _userIsOptedOut = true;

                }

                reader.ReadStartElement("COLUMNS"); Error Here: Element 'COLUMNS' was not found. Line 12, position 2

Тип узла был "пробел". Я не могу понять, как, черт возьми, пропустить этот проклятый <CAR/>.

Ответы [ 3 ]

1 голос
/ 19 марта 2009

Если читатель, который вы используете, является XMLReader, тогда используйте:

XmlReader reader;
reader.IsEmptyElement // to determine if you should try and parse the value.

Имейте в виду, что вы можете захотеть что-то одно, чтобы убедиться, что вы читаете контент, только строки следующего текста

Reader.Read();
Reader.MoveToContent();
1 голос
/ 19 марта 2009

Сначала прочитайте контент, затем либо наберите DateTime.Parse, либо не в зависимости от того, есть ли контент. Если вы иногда получаете «плохой» контент, который хотите пропустить, вам также следует обратить внимание на DateTime.TryParse. Что касается того, что именно вы должны делать в более сложной схеме, если вы получаете пустой элемент, это полностью зависит от вашего приложения - мы не можем вам этого сказать.

0 голосов
/ 02 ноября 2012

Мне тоже понадобилось время, чтобы разобраться. Вы должны сделать это так:

if (!reader.IsEmptyElement)
{
    reader.ReadStartElement("CAR");

    // Read the content
    _tDate = DateTime.Parse(reader.ReadContentAsString());

    reader.ReadEndElement();
}
else
    reader.Skip();

Это с XmlReaderSettings IgnoreWhitespace = true, в противном случае вам также нужно проверить узел пробела.

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