XML 文件丢失时 tinyxml2 出现分段错误

Segmentations fault on tinyxml2 when XML file is missed

我正在尝试从 Cophir XML 数据中获取一些信息。但是,某些 XML 文件很差,这会导致分段错误。

我正在尝试执行并导致错误的代码是:

 PhotoComments comments;



        XMLElement* commentsElement = doc.FirstChildElement("SapirMMObject")->FirstChildElement( "photo" )->FirstChildElement( "comments" );
        const char* numComments = commentsElement->GetText();


        if (strcmp(numComments, "0")==0 );
        else{


            commentsElement = doc.FirstChildElement("SapirMMObject")->FirstChildElement( "photo" )->FirstChildElement( "url" )->NextSiblingElement();



            XMLElement* commentElement;


            commentElement=commentsElement->FirstChildElement("comment");//This is where the segmentation fault happens.

一个好的 Cophir XML 是:

<SapirMMObject>
  <MediaLocator>
    <MediaUri>384278731</MediaUri>
  </MediaLocator>
  <photo id="384278731" secret="70755f9300" server="139" farm="1" dateuploaded="1170990970" isfavorite="0" license="0" rotation="0" originalsecret="70755f9300" originalformat="jpg">
    <owner nsid="22343845@N00" username="PeeTNeeT" realname="PeeT NeeT" location=""/>
    <title>Long Day</title>
    <description>3230</description>
    <dates posted="1170990970" taken="2007-02-09 04:16:10" takengranularity="0" lastupdate="1175617119"/>
    <comments>4</comments>
    <notes/>
    <tags><tag id="1514691-384278731-297641" author="22343845@N00" raw="forensic" machine_tag="0">forensic</tag>
      <tag id="1514691-384278731-1316" author="22343845@N00" raw="train" machine_tag="0">train</tag>
      <tag id="1514691-384278731-6816" author="22343845@N00" raw="transport" machine_tag="0">transport</tag>
      <tag id="1514691-384278731-31069" author="22343845@N00" raw="public transport" machine_tag="0">publictransport</tag>
      <tag id="1514691-384278731-290" author="22343845@N00" raw="people" machine_tag="0">people</tag>
      <tag id="1514691-384278731-4523" author="22343845@N00" raw="metro" machine_tag="0">metro</tag>
      <tag id="1514691-384278731-294" author="22343845@N00" raw="bw" machine_tag="0">bw</tag>
      <tag id="1514691-384278731-293" author="22343845@N00" raw="black and white" machine_tag="0">blackandwhite</tag>
      <tag id="1514691-384278731-1449949" author="22343845@N00" raw="peetneet" machine_tag="0">peetneet</tag>
      <tag id="1514691-384278731-536" author="22343845@N00" raw="holland" machine_tag="0">holland</tag></tags>
    <url>http://farm1.static.flickr.com/139/384278731_70755f9300.jpg</url><comments photo_id="384278731">
    <comment id="1514691-384278731-72157594531874043" author="69513727@N00" authorname="phil uk net" datecreate="1171296514" permalink="http://www.flickr.com/photos/peetneet/384278731/#comment72157594531874043">I don't think she got much sleep the night before.</comment>
    <comment id="1514691-384278731-72157594542562354" author="25617742@N00" authorname="ankern" datecreate="1171819505" permalink="http://www.flickr.com/photos/peetneet/384278731/#comment72157594542562354">What a high note! Please add to the 'Spontaneous Opera Syndrome' Pool! <a href="http://www.flickr.com/groups/s-o-s/">www.flickr.com/groups/s-o-s/</a></comment>
    <comment id="1514691-384278731-72157600025296602" author="86602256@N00" authorname="serakatie" datecreate="1174812250" permalink="http://www.flickr.com/photos/peetneet/384278731/#comment72157600025296602">I love the yawns. 

On the buses I ride, people are always sleeping or yawning. : )</comment>
    <comment id="1514691-384278731-72157600045352487" author="67288428@N00" authorname="x35mm" datecreate="1175617118" permalink="http://www.flickr.com/photos/peetneet/384278731/#comment72157600045352487">very good</comment></comments></photo>
  <Mpeg7>
    <Description type="ContentEntityType">
      <MultimediaContent type="ImageType">
        <Image>
          <VisualDescriptor type="ScalableColorType" numOfBitplanesDiscarded="0" numOfCoeff="64"><Coeff>-169 23 -21 54 -21 14 22 29 -4 13 11 22 -10 14 19 22 -7 1 0 2 -1 5 0 0 -15 2 2 0 -3 5 1 -4 -1 0 0 1 0 0 1 2 1 1 1 3 1 2 4 5 2 0 2 2 2 3 3 0 0 0 0 -2 1 0 -3 -3</Coeff>
          </VisualDescriptor>
          <VisualDescriptor type="ColorStructureType" colorQuant="2">
            <Values>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 252 225</Values></VisualDescriptor><VisualDescriptor type="ColorLayoutType"><YDCCoeff>17</YDCCoeff><CbDCCoeff>32</CbDCCoeff><CrDCCoeff>32</CrDCCoeff>
          <YACCoeff5>18 18 20 10 15</YACCoeff5>
          <CbACCoeff2>16 16</CbACCoeff2>
          <CrACCoeff2>16 16</CrACCoeff2></VisualDescriptor>
          <VisualDescriptor type="EdgeHistogramType"><BinCounts>3 3 6 6 5 4 3 5 7 3 2 3 5 6 6 4 1 2 6 3 4 3 5 5 6 4 2 5 6 5 6 2 3 3 4 6 1 5 4 3 3 3 3 6 2 2 3 5 6 6 5 2 3 7 4 6 0 5 1 3 3 2 7 0 5 3 3 7 4 5 2 6 3 3 4 1 6 1 5 2</BinCounts></VisualDescriptor>
          <VisualDescriptor type="HomogeneousTextureType">
            <Average>82</Average>
            <StandardDeviation>115</StandardDeviation>
            <Energy>214 209 189 199 183 184 189 174 198 193 163 156 160 166 173 166 131 137 132 135 171 143 123 117 130 115 185 118 114 112</Energy>
            <EnergyDeviation>213 206 187 204 182 178 179 164 193 190 151 147 151 158 159 151 118 135 126 113 170 123 117 114 128 94 166 100 86 97</EnergyDeviation></VisualDescriptor></Image></MultimediaContent></Description></Mpeg7></SapirMMObject>

导致分段错误的错误 XML 是(注意注释字段不存在):

<SapirMMObject>
  <MediaLocator>
    <MediaUri>384160944</MediaUri></MediaLocator>
  <photo id="384160944" secret="2b5c802b8f" server="124" farm="1" dateuploaded="1170980327" isfavorite="0" license="0" rotation="0">
    <owner nsid="22466016@N00" username="pepelsbey" realname="Vadim Makeev" location="Moscow, Russia"/>
    <title>«JavaScript libraries overview» speech</title>
    <description>October 28th, first WSG-Russia meeting</description>
    <dates posted="1170980327" taken="2007-02-09 03:18:47" takengranularity="0" lastupdate="1180122346"/>
    <comments>1</comments>
    <notes>
      <note id="72157594525441634" author="22466016@N00" authorname="pepelsbey" x="43" y="74" w="50" h="50">Marat Tanalin aka MT
http://mtonly.livejournal.com/</note>
      <note id="72157594525441869" author="22466016@N00" authorname="pepelsbey" x="181" y="70" w="50" h="50">Yuriy Artyukh aka Akella
http://cssing.org.ua/</note>
      <note id="72157594525442055" author="22466016@N00" authorname="pepelsbey" x="288" y="197" w="50" h="50">Marat Mamyashev aka ninja_127
http://cssblast.ru/</note></notes>
    <tags>
      <tag id="6771949-384160944-267129" author="22466016@N00" raw="wsg" machine_tag="0">wsg</tag>
      <tag id="6771949-384160944-4793" author="22466016@N00" raw="russia" machine_tag="0">russia</tag>
      <tag id="6771949-384160944-8327" author="22466016@N00" raw="meeting" machine_tag="0">meeting</tag></tags>
    <location latitude="55.692293" longitude="37.483978" accuracy="10">
      <locality>Moscow</locality>
      <county>Moscow</county>
      <region>Moskva</region>
      <country>Russia</country></location>
    <geoperms ispublic="1" iscontact="0" isfriend="0" isfamily="0"/>
    <url>http://farm1.static.flickr.com/124/384160944_2b5c802b8f.jpg</url></photo>
  <Mpeg7>
    <Description type="ContentEntityType">
      <MultimediaContent type="ImageType">
        <Image>
          <VisualDescriptor type="ScalableColorType" numOfBitplanesDiscarded="0" numOfCoeff="64"><Coeff>79 -33 -53 18 -28 -15 3 19 -16 -7 -3 22 -31 3 -6 12 -7 9 -3 8 -15 4 -10 4 -15 5 1 0 -14 5 -1 0 3 -3 -3 -6 2 -1 1 2 3 -3 0 3 0 1 4 3 -5 -3 2 5 0 6 4 3 -7 0 0 -2 -1 0 -3 -3</Coeff></VisualDescriptor>
          <VisualDescriptor type="ColorStructureType" colorQuant="2">
            <Values>57 0 0 0 8 0 0 27 121 98 1 2 0 1 0 0 61 26 2 0 0 0 19 11 138 166 90 57 5 6 0 3 71 63 47 32 10 11 4 19 156 148 143 92 64 49 23 30 100 83 59 75 53 43 32 57 193 243 158 127 93 91 86 124</Values></VisualDescriptor>
          <VisualDescriptor type="ColorLayoutType">
            <YDCCoeff>20</YDCCoeff>
            <CbDCCoeff>27</CbDCCoeff>
            <CrDCCoeff>36</CrDCCoeff>
            <YACCoeff5>16 11 21 6 20</YACCoeff5>
            <CbACCoeff2>17 17</CbACCoeff2>
            <CrACCoeff2>16 15</CrACCoeff2></VisualDescriptor>
          <VisualDescriptor type="EdgeHistogramType"><BinCounts>3 3 4 5 5 2 2 2 4 3 4 3 3 6 5 4 1 5 5 6 3 2 4 4 6 0 2 2 4 4 4 2 3 4 5 3 0 5 2 4 1 6 2 2 4 3 2 2 5 6 1 3 0 2 5 3 2 5 1 4 0 5 3 0 1 3 4 2 6 3 4 5 4 2 3 6 1 3 5 4</BinCounts></VisualDescriptor>
          <VisualDescriptor type="HomogeneousTextureType">
            <Average>75</Average>
            <StandardDeviation>100</StandardDeviation><Energy>176 178 187 188 174 160 175 164 174 178 173 167 159 162 149 161 143 150 153 161 158 165 168 156 192 204 184 182 204 195</Energy>
            <EnergyDeviation>183 175 185 185 173 156 169 160 172 174 163 159 147 156 138 147 127 144 138 135 157 144 160 153 170 174 150 162 156 172</EnergyDeviation></VisualDescriptor></Image></MultimediaContent></Description></Mpeg7></SapirMMObject>

我已经研究过了,但我发现的只是一些人说 "commentElement" 会收到一个空指针,这实际上并没有发生。命令 "commentElement=commentsElement->FirstChildElement("comment");"直接产生分段错误。

问题出在之前,你在调用

FirstChildElement( "url" )->NextSiblingElement();

所以你问的是 url 元素相同深度但在它之后的节点。第二个 XML 树在 url 节点之后没有任何兄弟节点,因此根据文档 0 返回:

Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element.

所以你应该在尝试取消引用之前检查 commentsElement != 0