2011-09-06 12 views
5

इम KissXML साथ (KISSxml साथ iphone पर उत्पन्न) निम्नलिखित एक्सएमएल फ़ाइल पार्स करने का प्रयास: यह से एक कोर डेटा वस्तु बनाने के लिए निम्नलिखित कोड का उपयोग करनाkissXML 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> 

:

-(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/namePerson/name//namename की कोशिश की है प्राप्त करने के लिए और वे सभी एक 0 लंबाई सरणी लौट आते हैं। /SnowProfile के लिए एक प्रश्न भी एक 0 लंबाई सरणी देता है जो मुझे लगता है कि xml पार्सिंग के साथ कुछ गलत हो रहा है। मैंने एक्सएमएल फाइल को प्रमाणित किया है और यह ठीक है, और एनएसएलओएल आउटपुट से मैं बता सकता हूं कि फाइल लोड हो रही है।

उत्तर

3

एक namespace xmlns:gml="http://www.opengis.net/gml"

परिभाषित xpath की मेरी याद से नहीं है, तो आप निर्दिष्ट करने की आवश्यकता है कि जब आप एक xpath क्वेरी से करते हैं। यह देखने के लिए /gml:SnowProfile आज़माएं कि क्या यह 0 लंबाई सरणी के अलावा कुछ और देता है। तब आपको पता चलेगा कि यह आपकी समस्या का समाधान करेगा या नहीं।

+2

डिफ़ॉल्ट नामस्थान, xmlns = "http://caaml.org/Schemas/V5.0/Profiles/SnowProfileIACS" के साथ त्रुटि ठीक से पार्स करने के लिए, मैंने फ़ाइल को एक mutableString के रूप में लोड किया था और इसे डीडीएक्सएमएल दस्तावेज़ में बनाने से पहले नेमस्पेस घोषणा से छुटकारा पाएं। – Jesse

0

आपको सही पार्सिंग के लिए "noNSxml" द्वारा HTML टैग की "xmlns" विशेषता को प्रतिस्थापित करना होगा। यदि आप इसका पुन: उपयोग करना चाहते हैं, तो यह आपको सुझाव देता है कि फिर आप tml xmlns डाल दें।

0

फ़ाइल को पाठ के रूप में संसाधित करने और इसे संशोधित करने के बजाय, डिफ़ॉल्ट नामस्थान का नाम बदला जा सकता है और इस प्रकार पूछताछ की जा सकती है। विवरण कोड के साथ this answer में हैं।

संबंधित मुद्दे