kissXML не возвращает значений для запроса xpath - PullRequest
5 голосов
/ 06 сентября 2011

Я пытаюсь проанализировать следующий XML-файл (созданный на iphone с KISSxml) с помощью KissXML:

<?xml version="1.0" encoding="UTF-8"?>
<SnowProfile xmlns="http://caaml.org/Schemas/V5.0/Profiles/SnowProfileIACS" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://caaml.org/Schemas/V5.0/Profiles/SnowProfileIACS http://caaml.org/Schemas/V5.0/Profiles/SnowprofileIACS/CAAMLv5_SnowProfileIACS.xsd" gml:id="2011-09-04-Home">
  <metaDataProperty>
    <MetaData>
      <dateTimeReport>2011-09-04T18:45:10-0700</dateTimeReport>
      <srcRef>
        <Operation>
          <name>My op</name>
          <contactPerson>
            <Person>
              <name>Jesse</name>
            </Person>
          </contactPerson>
        </Operation>
      </srcRef>
    </MetaData>
  </metaDataProperty>
  <validTime>
    <TimeInstant>
      <timePosition>2011-09-04T18:45:10-0700</timePosition>
    </TimeInstant>
  </validTime>
  <snowProfileResultsOf>
    <SnowProfileMeasurements dir="top down">
      <comment>Testing</comment>
      <profileDepth uom="cm">58</profileDepth>
      <skyCond>BKN</skyCond>
      <precipTI>None</precipTI>
      <airTempPres uom="degC">2</airTempPres>
      <windSpd uom="ms-1">5</windSpd>
      <windDir>
        <AspectPosition>
          <position>E</position>
        </AspectPosition>
      </windDir>
      <hS>
        <Components>
          <snowHeight uom="cm">3</snowHeight>
        </Components>
      </hS>
      <penetrationSki uom="cm">14</penetrationSki>
      <penetrationFoot uom="cm">8</penetrationFoot>
      <penetrationRam uom="cm">22</penetrationRam>
      <stratProfile>
        <Layer>
          <depthTop uom="cm">0</depthTop>
          <thickness uom="cm">27</thickness>
          <grainFormPrimary>PPsd</grainFormPrimary>
          <grainSize uom="mm">14</grainSize>
          <hardness uom="">4F</hardness>
          <lwc uom="">W</lwc>
          <density uom="kg/m3">310</density>
          <validFormationTime>
            <timeInstant>
              <timePosition>2011-09-05</timePosition>
            </timeInstant>
          </validFormationTime>
        </Layer>
        <Layer>
          <depthTop uom="cm">27</depthTop>
          <thickness uom="cm">31</thickness>
          <grainFormPrimary>PPnd</grainFormPrimary>
          <grainFormSecondary>PPpl</grainFormSecondary>
          <grainSize uom="mm">11</grainSize>
          <hardness uom="">1F</hardness>
          <lwc uom="">S</lwc>
          <density uom="kg/m3">263</density>
          <validFormationTime>
            <timeInstant>
              <timePosition>2011-07-05</timePosition>
            </timeInstant>
          </validFormationTime>
        </Layer>
      </stratProfile>
      <tempProfile uomDepth="cm" uomTemp="C">
        <Obs>
          <depth>2</depth>
          <snowTemp>0</snowTemp>
        </Obs>
        <Obs>
          <depth>18</depth>
          <snowTemp>-4</snowTemp>
        </Obs>
        <Obs>
          <depth>52</depth>
          <snowTemp>-1</snowTemp>
        </Obs>
      </tempProfile>
      <stbTests>
        <RBlockTest>
          <comment>Test</comment>
          <failedOn>
            <Layer uom="cm">
              <depthTop>25</depthTop>
            </Layer>
            <Results>
              <testScore>3</testScore>
              <fractureCharacter>Q3</fractureCharacter>
            </Results>
          </failedOn>
        </RBlockTest>
      </stbTests>
    </SnowProfileMeasurements>
  </snowProfileResultsOf>
  <locRef>
    <ObsPoint>
      <name>Home</name>
      <validElevation>
        <ElevationPosition uom="m">
          <position>110</position>
        </ElevationPosition>
      </validElevation>
      <validAspect>
        <AspectPosition>
          <position>SW</position>
        </AspectPosition>
      </validAspect>
      <validSlopeAngle>
        <SlopeAnglePosition uom="deg">
          <position>2</position>
        </SlopeAnglePosition>
      </validSlopeAngle>
      <pointLocation>
        <gml:Point srsDimension="2">
          <gml:pos></gml:pos>
        </gml:Point>
      </pointLocation>
    </ObsPoint>
  </locRef>
</SnowProfile>

Использование следующего кода для создания из него объекта основных данных:

-(BOOL)importFile:(NSString *)fileName error:(NSError **)error{
    NSData *data = [[NSData alloc] initWithContentsOfFile:fileName];
    if(data == nil)
        return NO;
    DDXMLDocument *doc = [[DDXMLDocument alloc] initWithData:data options:0 error:error];
    //if(error != nil)
    if(doc == nil)
        return NO;

    snowPit *pit = [snowPit pitForCAAMLProfile:doc];
    if(pit != nil)
        return YES;
    else
        return NO;
}

+(snowPit *)pitForCAAMLProfile:(DDXMLDocument *)xmlDoc{
    NSLog(@"%@", [xmlDoc XMLStringWithOptions:DDXMLNodePrettyPrint] );

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    NSError *err;

    snowPit *newPit = [[pitManager sharedManager] newPitWithoutDefaults];
    NSArray *fields = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"CAAMLImportFields" ofType:@"plist"]];
    for(NSDictionary *importField in fields){
        NSString *field = [importField valueForKey:@"field"];
        NSString *xpath = [importField valueForKey:@"xpath"];
        NSString *attribute = [importField valueForKey:@"attribute"];
        NSArray *nodes;
        if(xpath != nil && [xpath length] > 0){
            nodes = [xmlDoc nodesForXPath:xpath error:nil];
            NSLog(@"Field:%@, xpath:%@, attribute:%@ nodes:%i", field, xpath, attribute, [nodes count]);
            if(nodes != nil && [nodes count] > 0){
                NSString *value;
                if(attribute != nil && [attribute length] > 0){
                    DDXMLNode *attNode = [[nodes objectAtIndex:0] attributeForName:attribute];
                    if(attNode != nil)
                        value = [attNode stringValue];
                }else
                    value = [[nodes objectAtIndex:0] stringValue];
                if(value != nil && [value length] > 0)
                    [newPit setValue:value forKey:field];
            }
        }
    }
    [dateFormatter release];
    return newPit;
}

Но пока каждый запрос XPath, который я пробую, возвращает массив длиной 0.

Чтобы получить значение для имени, которое я пробовал //Person/name Person/name //name name И все они возвращают массив 0 длины.Даже запрос для /SnowProfile возвращает массив длины 0, что наводит меня на мысль, что что-то идет не так с синтаксическим анализом xml.Я проверил файл XML, и это нормально, и из вывода NSlog я могу сказать, что файл загружается.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

Определено пространство имен xmlns:gml="http://www.opengis.net/gml"

Из моего воспоминания о xpath вам нужно указать это при выполнении запроса xpath. Попробуйте /gml:SnowProfile, чтобы увидеть, возвращает ли это что-то кроме массива 0 длины. Затем вы узнаете, решит ли это вашу проблему.

0 голосов
/ 18 декабря 2013

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

0 голосов
/ 25 января 2013

Вы должны заменить атрибут «xmlns» тега html на «noNSxml», чтобы иметь правильный синтаксический анализ. Если вы хотите использовать его повторно, советуем вам поставить доллар xmlns.

...