2011-09-06 15 views
5

Im tratando de analizar el siguiente archivo XML (generada en el iPhone con KISSxml) con KissXML:kissXML volviendo Sin valores para consulta XPath

<?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> 

Usando el siguiente código para crear un objeto de datos central de ella:

-(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; 
} 

Pero hasta ahora cada consulta de XPath que intento devuelve una matriz de 0 de longitud.

para obtener el valor para el nombre que he intentado //Person/namePerson/name//namename Y todos ellos devolver una matriz 0 longitud. Incluso una consulta para /SnowProfile devuelve una matriz de 0 longitudes que me lleva a pensar que algo anda mal con el análisis xml. He validado el archivo XML y está bien, y desde el resultado de NSlog puedo decir que el archivo se está cargando.

Respuesta

3

Hay un espacio de nombres definido xmlns:gml="http://www.opengis.net/gml"

De mi recuerdo de XPath, es necesario especificar que cuando se hace una consulta XPath. Pruebe /gml:SnowProfile para ver si eso arroja algo más que una matriz de 0 longitudes. Entonces sabrá si esto resolverá su problema.

+2

El error resultó ser con el espacio de nombres predeterminado, xmlns = "http://caaml.org/Schemas/V5.0/Profiles/SnowProfileIACS", para que se pueda analizar correctamente tuve que cargar el archivo como mutableString y deshacerse de la declaración del espacio de nombres antes de convertirlo en un DDXmlDocument. – Jesse

0

Debe reemplazar el atributo "xmlns" de la etiqueta html por "noNSxml" para tener un análisis correcto. Si quieres reutilizarlo, te sugiere que pones fichas xmlns.

0

En lugar de procesar el archivo como texto y modificarlo, se puede cambiar el nombre del espacio de nombre predeterminado y, por lo tanto, consultarlo. Los detalles están en this answer, con el código.

Cuestiones relacionadas