You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by Donald Brady <db...@apple.com> on 2007/12/13 01:27:28 UTC

Help with selecting XML with nested namespaces

Hi

I am trying to select a value from the xml that is spat out by the  
JHOVE project (http://hul.harvard.edu/jhove/). The xsd describing the  
xml results a jhove command is http://hul.harvard.edu/ois/xml/ns/jhove.

The xsd has another nested namespace http://www.loc.gov/mix/ and I am  
trying to select information at this nested level (namely  
mix:ImageWidth)

Here is some relevant XML:

<?xml version="1.0" encoding="UTF-8"?>
<jhove xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns="http://hul.harvard.edu/ois/xml/ns/jhove"  
xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/jhove http:// 
hul.harvard.edu/ois/xml/xsd/jhove/1.3/jhove.xsd" name="Jhove"  
release="1.0" date="2005-05-26">
  <date>2007-12-12T13:16:55-08:00</date>
  <repInfo uri="/opt/itms_import/Labels/FilterUS/packages/ 
10000000018106-20071212131633.itmsp/cover.tif">
   <reportingModule release="1.3" date="2005-05-05">TIFF-hul</ 
reportingModule>
   <lastModified>2007-12-12T13:16:37-08:00</lastModified>
   <size>1088278</size>
...
        <mix:mix xmlns:mix="http://www.loc.gov/mix/"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.loc.gov/mix/ http://www.loc.gov/mix/ 
mix.xsd">
         <mix:BasicImageParameters>
...
         </mix:BasicImageParameters>
         <mix:ImageCreation>
...
         </mix:ScanningSystemCapture>
         </mix:ImageCreation>
          <mix:ImagingPerformanceAssessment>
           <mix:SpatialMetrics>
            <mix:SamplingFrequencyUnit>2</mix:SamplingFrequencyUnit>
            <mix:XSamplingFrequency>300</mix:XSamplingFrequency>
            <mix:YSamplingFrequency>300</mix:YSamplingFrequency>
            <mix:ImageWidth>600</mix:ImageWidth>
            <mix:ImageLength>600</mix:ImageLength>
          </mix:SpatialMetrics>
          <mix:Energetics>
...
   </properties>
  </repInfo>
</jhove>

I get an XmlObject for the mix section like so:

     private XmlObject mix() {
         XmlObject result = null;
         String namespace = "declare namespace jhove='http:// 
hul.harvard.edu/ois/xml/ns/jhove';";
         String path = "//*[namespace-uri()='http://www.loc.gov/mix/'  
and local-name()='mix']";
         String query = namespace + path;

         XmlObject[] mixes = document.selectPath(query);
         if ((mixes != null) && (mixes.length > 0))
             result = mixes[0];

         return result;
     }

and returns this:

<xml-fragment xsi:schemaLocation="http://www.loc.gov/mix/ http:// 
www.loc.gov/mix/mix.xsd" xmlns:mix="http://www.loc.gov/mix/"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <mix:BasicImageParameters>
     <mix:Format>
       <mix:MIMEType>image/jpeg</mix:MIMEType>
       <mix:ByteOrder>big-endian</mix:ByteOrder>
       <mix:Compression>
         <mix:CompressionScheme>6</mix:CompressionScheme>
       </mix:Compression>
  ...


I have this code to try and get the width:

     public Double width() {
         Double width = null;
         XmlObject mix = mix();
         String mixNamespace = "declare namespace mix='http:// 
www.loc.gov/mix/';";
         String path = "./mix:ImagingPerformanceAssessment/ 
mix:SpatialMetrics/mix:ImageWidth";
         String query = mixNamespace + path;
         XmlCursor widthCursor = mix.newCursor().execQuery(query);

         if (widthCursor != null) {
             String widthString = widthCursor.getTextValue();
             try {
                 width = new Double(widthString);
             }
             catch (NumberFormatException e) {
                 log.info("Unexpected string in the jhove result file  
for mix:ImageWidth");
             }
         }

         return width;
     }

The widthCursor.currentTokenType after execQuery() though is  
STARTDOC. Am I doing something fundamentally wrong with this  
approach? BTW the path /mix:mix/mix:ImagingPerformanceAssessment/ 
mix:SpatialMetrics/mix:ImageWidth is correct when executed in oXygen.

Thanks for any help.

Donald