Search code examples
oracle-databasexpathextractexifmultimedia

Oracle JPG metadata xpath from XMLTYPE column


I have a tavle storing photos. With a pl/sql script i extract the image metadata to the exifmetadata xmltype column. I would like to select the elements one by one, but i always get null back and i don't know what is the issue with my xpath expression.

    <exifMetadata xmlns="http://xmlns.oracle.com/ord/meta/exif" xsi:schemaLocation="http://xmlns.oracle.com/ord/meta/exif http://xmlns.oracle.com/ord/meta/exif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <TiffIfd>
      <Make tag="271">Apple</Make>
      <Model tag="272">iPhone 4S</Model>
      <Orientation tag="274">top left</Orientation>
      <XResolution tag="282">72.0</XResolution>
      <YResolution tag="283">72.0</YResolution>
      <ResolutionUnit tag="296">inches</ResolutionUnit>
      <Software tag="305">6.0.1</Software>
      <DateTime tag="306">2012-11-16T13:31:15</DateTime>
      <YCbCrPositioning tag="531">centered</YCbCrPositioning>
   </TiffIfd>
   <ExifIfd tag="34665">
      <ExposureTime tag="33434">0.004405286</ExposureTime>
      <FNumber tag="33437">2.4</FNumber>
      <ExposureProgram tag="34850">Normal program</ExposureProgram>
      <ExifVersion tag="36864">0221</ExifVersion>
      <DateTimeOriginal tag="36867">2012-11-16T12:49:58</DateTimeOriginal>
      <DateTimeDigitized tag="36868">2012-11-16T12:49:58</DateTimeDigitized>
      <ComponentsConfiguration tag="37121">Y</ComponentsConfiguration>
      <ShutterSpeedValue tag="37377">7.82697</ShutterSpeedValue>
      <ApertureValue tag="37378">2.5260692</ApertureValue>
      <BrightnessValue tag="37379">6.641153</BrightnessValue>
      <MeteringMode tag="37383">Pattern</MeteringMode>
      <Flash tag="37385">
         <Fired>No</Fired>
      </Flash>
      <FocalLength tag="37386">4.28</FocalLength>
      <FlashpixVersion tag="40960">0100</FlashpixVersion>
      <ColorSpace tag="40961">sRGB</ColorSpace>
      <PixelXDimension tag="40962">2902</PixelXDimension>
      <PixelYDimension tag="40963">1938</PixelYDimension>
      <SensingMethod tag="41495">One-chip color area</SensingMethod>
      <ExposureMode tag="41986">Auto exposure</ExposureMode>
      <WhiteBalance tag="41987">Auto</WhiteBalance>
      <FocalLengthIn35mmFilm tag="41989">35</FocalLengthIn35mmFilm>
      <SceneCaptureType tag="41990">Standard</SceneCaptureType>
   </ExifIfd>
</exifMetadata>

And the SQL:

    SELECT 
  p.metaexif.extract('//exifMetadata/TiffIfd/Make/text()').getStringVal() "Model" 
  FROM scott.photos p
  WHERE id=22
  ;

The id 22 record exist that is sure.


Solution

  • you have a default namespace set so you have to cope with this.

    eg use this:

    select extractvalue(p.metaexif,'/exifMetadata/TiffIfd/Make',
            'xmlns="http://xmlns.oracle.com/ord/meta/exif"')