TBXML Проблема при разборе textForElement - PullRequest
1 голос
/ 08 июня 2011

У меня большая проблема с использованием TBXML.

Когда я использую:

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement {
    if (nil == aXMLElement->text) return @"";
    return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding];
}

для анализа этого XML

[...]
<step id=123>this string is not parsed
  <draw_at x="1964"/>
  <partials>
    <partial sd="23">
      <line>ANOTHER TEXT 1</line>
      <line>ANOTHER TEXT 2</line>
    </partial>
  </partials>
</step>
[...]

я получаю ПУСТАЯ строка.

Я полагаю, это потому, что тег STEP содержит более одного текста,

действительно, если я использую ту же функцию для получения другого шага без тега PARTIALS, строка правильная, не пустая!

Я получаю шаг таким образом:

NSstring *_step = [TBXML textForElement:step];

Есть идеи, как решить эту проблему?

Благодарю.

РЕДАКТИРОВАТЬ : этот XML действителен.Это используется годами.Это только часть, скопированная из оригинала, которая должна быть вставлена ​​здесь более долго.

РЕДАКТИРОВАТЬ 2 : я пишу вручную этот фрагмент, возможно, пропуская кавычки или что-то еще, но xml действителен.

Ответы [ 3 ]

1 голос
/ 08 июня 2011

Этот XML не является допустимым XML, поэтому у вас будут проблемы с ним. То же самое относится и к libxml2 (я знаю, у меня была такая же проблема).

0 голосов
/ 14 июня 2011

Временное исправление с использованием другого парсера для пустой строки.
Я использую PerformXMLXPathQuery() от XPathQuery.h/.m

Это работает!

... и XML правильный и подтвердить с помощью W3C с помощью NO ERRORS !

Отчет от validator.w3.org :

Этот документ был успешно проверен а правильно сформированный XML!
Результат: Пройдено, 1 предупреждение (я)

Если вместо этого патча есть лучшее решение, я меняю правильный ответ на правильный.

спасибо.

0 голосов
/ 08 июня 2011

Позвольте мне прояснить вашу проблему на простом примере, который я получил от форума TBXML

Если вы хотите разобрать XML что-то вроде,

<xml> 
<alert id="b19260fa7f00000100258097dcd87ab7">
    <title>MU-Lancaster Now Open</title>
    <startdate>1304353800</startdate>
    <enddate>1304362800</enddate>
    <type>Emergency</type>
    <message>
        <p>MU-Lancaster, at 42 N. Prince St., in Lancaster, is now open.&#160; It had been closed this morning due to the evacuation of downtown Lancaster.</p>
    </message>
</alert> 

Чем вам нужно написать код для разбора, так это:

- (void)parseMuAlertXML{
TBXML *tbxml;
TBXMLElement *rootXMLElement;
TBXMLElement *node_alert;
TBXMLElement *node_message;
TBXMLElement *node_traverse;

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

NSURL *url = [NSURL URLWithString:@"http://www.millersville.edu/alert/alert.xml"];

tbxml = [TBXML tbxmlWithURL:url];

rootXMLElement = tbxml.rootXMLElement; если (rootXMLElement) { node_alert = [TBXML childElementNamed: @ "alert" parentElement: rootXMLElement];

    if(node_alert)
    {
        node_traverse = [TBXML childElementNamed:@"startdate" parentElement:node_alert];
        NSInteger startString =  [[TBXML textForElement:node_traverse] intValue];
        time_t startTime = startString;

        node_traverse = [TBXML childElementNamed:@"enddate" parentElement:node_alert];
        NSInteger endString =  [[TBXML textForElement:node_traverse] intValue];
        time_t endTime = endString;

        node_traverse = [TBXML childElementNamed:@"type" parentElement:node_alert];
        alertType = [[TBXML textForElement:node_traverse] retain];

        node_message = [TBXML childElementNamed:@"message" parentElement:node_alert];

        if(node_message)
        {
            node_traverse = [TBXML childElementNamed:@"p" parentElement:node_message];
            alertMessage = [TBXML textForElement:node_traverse];
            alertMessage = [alertMessage stringByReplacingOccurrencesOfString:@"&#160;" withString:@" "];
        }

        if((unixTime >= startTime) && (unixTime <= endTime))
        {
            [alertButton setHidden:NO];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        } else {
            [alertButton setHidden:YES];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        }
    }
}

}

также ваш xml не является действительным xml, Я думаю, что ваш XML будет,

<step id="123"> this string is not parsed<draw_at x="1964"/><partials><partial sd="23"><line>ANOTHER TEXT 1</line><line>ANOTHER TEXT</line></partial></partials></step>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...