bufr/src/main/java/ucar/nc2/iosp/bufr/tables/WmoXmlReader.java
static void readWmoXmlTableD(InputStream ios, TableD tableD) throws IOException {
    org.jdom2.Document doc;
    try {
      SAXBuilder builder = new SAXBuilder();
      doc = builder.build(ios);
    } catch (JDOMException e) {
      throw new IOException(e.getMessage());
    }

    int currSeqno = -1;
    TableD.Descriptor currDesc = null;

    Element root = doc.getRootElement();

    String[] elems = null;
    for (Version v : Version.values()) {
      elems = v.getElemNamesD();
      List<Element> featList = root.getChildren(elems[0]);
      if (featList != null && featList.size() > 0) {
        break;
      }
    }

    if (elems == null) {
      elems = Version.BUFR_WMO.getElemNamesD();
    }

    List<Element> featList = root.getChildren();
    for (Element elem : featList) {
      Element ce = elem.getChild(elems[1]);
      if (ce == null) continue;

      String seqs = elem.getChildTextNormalize("FXY1");
      int seq = Integer.parseInt(seqs);

      if (currSeqno != seq) {
        int y = seq % 1000;
        int w = seq / 1000;
        int x = w % 100;
        String seqName = Util.cleanName(elem.getChildTextNormalize(elems[1]));
        currDesc = tableD.addDescriptor((short) x, (short) y, seqName, new ArrayList<Short>());
        currSeqno = seq;
      }

      String fnos = elem.getChildTextNormalize("FXY2");
      int fno = Integer.parseInt(fnos);
      int y = fno % 1000;
      int w = fno / 1000;
      int x = w % 100;
      int f = w / 100;
      int fxy = (f << 14) + (x << 8) + y;
      currDesc.addFeature((short) fxy);
    }
    ios.close();
  }
static void readWmoXmlTableD(InputStream ios, TableD tableD) throws IOException {
    org.jdom2.Document doc;
    try {
      SAXBuilder builder = new SAXBuilder();
      doc = builder.build(ios);
    } catch (JDOMException e) {
      throw new IOException(e.getMessage());
    }

    int currSeqno = -1;
    TableD.Descriptor currDesc = null;

    Element root = doc.getRootElement();

    String[] elems = null;
    for (Version v : Version.values()) {
      elems = v.getElemNamesD();
      List<Element> featList = root.getChildren(elems[0]);
      if (featList != null && featList.size() > 0) {
        break;
      }
    }

    if (elems == null) {
      elems = Version.BUFR_WMO.getElemNamesD();
    }

    List<Element> featList = root.getChildren();
    for (Element elem : featList) {
      Element ce = elem.getChild(elems[1]);
      if (ce == null) continue;

      String seqs = elem.getChildTextNormalize("FXY1");
      int seq = Integer.parseInt(seqs);

      if (currSeqno != seq) {
        int y = seq % 1000;
        int w = seq / 1000;
        int x = w % 100;
        String seqName = Util.cleanName(elem.getChildTextNormalize(elems[1]));
        currDesc = tableD.addDescriptor((short) x, (short) y, seqName, new ArrayList<Short>());
        currSeqno = seq;
      }

      String fnos = elem.getChildTextNormalize("FXY2");
      int fno = Integer.parseInt(fnos);
      int y = fno % 1000;
      int w = fno / 1000;
      int x = w % 100;
      int f = w / 100;
      int fxy = (f << 14) + (x << 8) + y;
      currDesc.addFeature((short) fxy);
    }
    ios.close();
  }
/*
<B_TableD_BUFR14_1_0_CREX_6_1_0>
<SNo>2647</SNo>
<Category>10</Category>
<FXY1>310013</FXY1>
<ElementName1_E>(AVHRR (GAC) report)</ElementName1_E>
<FXY2>004005</FXY2>
<ElementName2_E>Minute</ElementName2_E>
<Remarks_E>Minute</Remarks_E>
<Status>Operational</Status>
</B_TableD_BUFR14_1_0_CREX_6_1_0>

14.2.0
<Exporting_BUFRTableD_E>
<No>2901</No>
<Category>10</Category>
<CategoryOfSequences>Vertical sounding sequences (satellite data)</CategoryOfSequences>
<FXY1>310025</FXY1>
<ElementName1>(SSMIS Temperature data record)</ElementName1>
<FXY2>004006</FXY2>
<Status>Operational</Status>
</Exporting_BUFRTableD_E>

15.1.1
<Exp_BUFRTableD_E>
<No>102</No>
<Category>01</Category>
<CategoryOfSequences_E>Location and identification sequences</CategoryOfSequences_E>
<FXY1>301034</FXY1>
<Title_E>(Buoy/platform - fixed)</Title_E>
<FXY2>001005</FXY2>
<ElementName_E>Buoy/platform identifier</ElementName_E>
<ExistingElementName_E>Buoy/platform identifier</ExistingElementName_E>
<Status>Operational</Status>
</Exp_BUFRTableD_E>

16.0.0
<Exp_BUFRTableD_E>
<No>402</No>
<Category>02</Category>
<CategoryOfSequences_E>Meteorological sequences common to surface data</CategoryOfSequences_E>
<FXY1>302001</FXY1>
<FXY2>010051</FXY2>
<ElementName_E>Pressure reduced to mean sea level</ElementName_E>
<ExistingElementName_E>Pressure reduced to mean sea level</ExistingElementName_E>
<Status>Operational</Status>
</Exp_BUFRTableD_E>

<BUFR_19_1_1_TableD_en>
<No>4</No>
<Category>00</Category>
<CategoryOfSequences_en>BUFR table entries sequences</CategoryOfSequences_en>
<FXY1>300003</FXY1>
<Title_en>(F, X, Y of descriptor to be added or defined)</Title_en>
<FXY2>000011</FXY2>
<ElementName_en>X descriptor to be added or defined</ElementName_en>
<Status>Operational</Status>
</BUFR_19_1_1_TableD_en>

<BUFR_22_0_1_TableD_en>
<No>5874</No>
<Category>15</Category>
<CategoryOfSequences_en>Oceanographic report sequences</CategoryOfSequences_en>
<FXY1>315004</FXY1>
<Title_en>(XBT temperature profile data sequence)</Title_en>
<FXY2>025061</FXY2>
<ElementName_en>Software identification and version number</ElementName_en>
<Status>Operational</Status>
</BUFR_22_0_1_TableD_en>