草庐IT

iphone - kissXML 不为 xpath 查询返回任何值

coder 2024-06-26 原文

我正在尝试使用 KissXML 解析以下 XML 文件(在 iphone 上使用 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 输出中我可以看出文件正在加载。

最佳答案

有一个命名空间定义xmlns:gml="http://www.opengis.net/gml"

根据我对 xpath 的记忆,您需要在执行 xpath 查询时指定它。试试 /gml:SnowProfile 看看它是否返回 0 长度数组以外的东西。然后您就会知道这是否会解决您的问题。

关于iphone - kissXML 不为 xpath 查询返回任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322283/

有关iphone - kissXML 不为 xpath 查询返回任何值的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  5. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  8. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  9. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  10. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

随机推荐