2

XML 応答を J2ME にバインドする必要がある J2ME アプリケーションがあります。

4

2 に答える 2

0

JiBXは J2ME をサポートしているようです。次の関連する JIRA の問題を参照してください: [#JIBX-110] J2ME 互換の公式の jibx リリース

ダウンロードしたら、( が置かれているディレクトリから)j2meターゲットを使用して j2me jar を ant-build する必要があります。専用のコンパイラは必要なく、標準の でビルドできます( JiBX ユーザー リストのこの議論を参照してください)。ant j2mebuildbuild.xmljavac

于 2012-09-20T13:25:20.703 に答える
0

XML ファイルを Java クラスに非整列化する必要があるようです。もしそうなら、私は私のブログで一般的な方法を共有しました. 2 つのクラスを使用して実装します。最初のクラスのコードは次のとおりです。

public class XMLTag {
  // if you do not have enough memory, use lazy 
  // instantiation on these attributes
  private Hashtable attributes = new Hashtable();
  private Vector childs = new Vector();

  public void setAttributeValue(String attribute, String value) {
    if (attribute != null && value != null) {
      attributes.put(attribute, value);
    }
  }

  public String getAttributeValue (String attribute) {
    return (String) attributes.get(attribute);
  }

  public void addChild (XMLTag child) {
    childs.addElement(child);
  }

  public Enumeration getChilds () {
    return childs.elements();
  }

  public XMLTag getChildAt (int index) {
    return (XMLTag) childs.elementAt(index);
  }
}

以下は、2 番目のクラスのソース コードです。

class XMLBinder extends org.xml.sax.helpers.DefaultHandler {

  private Hashtable map = new Hashtable();
  private Stack stack = new Stack();
  private XMLTag rootElement;

  private String attribute;
  private StringBuffer value = new StringBuffer();

  /**
   * @param map with String keys and XMLTag values
   */
  public XMLBinder(Hashtable map) {
    Enumeration e = map.keys();
    while (e.hasMoreElements()) {
      Object key = e.nextElement();
      Object tag = map.get(key);
      if (validateMapping(key, tag)) {
        this.map.put(key, tag);
      } else {
        throw new IllegalArgumentException("key " + key);
      }
    }
  }

  private boolean validateMapping (Object key, Object tag) {
    return key instanceof String
           && tag instanceof Class
           && XMLTag.class.isAssignableFrom((Class) tag);
  }

  public XMLTag unmarshall (InputStream in) throws IOException {
    try {
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
      parser.parse(in, this);
      return rootElement;
    } catch (Exception ex) {
      throw new IOException("caused by " + ex);
    }
  }

  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException {
    Class tag = (Class) map.get(qName);
    if (tag != null) {
      try {
        XMLTag newTag = (XMLTag) tag.newInstance();
        addAttributesToXMLTag(attributes, newTag);
        stack.push(newTag);
      } catch (Exception e) {
        throw new SAXException("caused by " + e);
      }
    } else {
      attribute = qName;
    }
  }

  private void addAttributesToXMLTag (Attributes attributes, XMLTag newTag) {
    if (attributes != null) {
      for (int i = attributes.getLength() - 1; i >= 0; i--) {
        String attrName = attributes.getQName(i);
        String attrValue = attributes.getValue(i);
        newTag.setAttributeValue(attrName, attrValue);
      }
    }
  }

  public void characters(char[] ch, int start, int length) {
    if (attribute != null) {
      value.append(ch, start, length);
    }
  }

  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    if (stack.isEmpty()) {
      throw new SAXException("no mapping for " + qName);
    }
    if (attribute != null && attribute.equals(qName)) {
      XMLTag parent = (XMLTag) stack.peek();
      parent.setAttributeValue(attribute, value.toString());
      attribute = null;
      value.setLength(0);
    } else {
      XMLTag child = (XMLTag) stack.pop();
      if (stack.isEmpty() == false) {
        XMLTag parent = (XMLTag) stack.peek();
        parent.addChild(child);
      } else {
        rootElement = (XMLTag) child;
      }
    }
  }
}

Class.forName の使用を防ぐために、タグとクラスを含むマップを使用します。キーはタグ名を持つ文字列で、値は XMLTag を拡張するクラスです。たとえば、RSS フィードを読み取るには、以下のクラスを使用します。

class RSS extends XMLTag {
  Channel channel;
  public void addChild(XMLTag child) {
    if (child instanceof Channel) {
      channel = (Channel) child;
    }
  }
}
class Channel extends XMLTag {
  public void addChild(XMLTag child) {
    if (child instanceof Item) {
      super.addChild(child);
    }
  }
}
class Item extends XMLTag {
}

そして、次の地図:

Hashtable map = new Hashtable();
map.put("rss", RSS.class);
map.put("channel", Channel.class);
map.put("item", Item.class);

その後、バインダーを使用できます。

XMLBinder binder = new XMLBinder(map);
rss = (RSS) binder.unmarshall(in);

コメント後に更新

xml サンプルでは、​​次のクラスを作成する必要があります。

class DataTable extends XMLTag {
  XsSchema xsSchema;
  DiffgrDiffgram diffgrDiffgram;
  public void addChild(XMLTag child) {
    if (child instanceof XsSchema) {
      xsSchema = (XsSchema) child;
    }
    else if (child instanceof DiffgrDiffgram) {
      diffgrDiffgram = (DiffgrDiffgram) child;
    }
  }
}
class XsSchema extends XMLTag {
}
class DiffgrDiffgram extends XMLTag {
}

次のマップを使用します

Hashtable map = new Hashtable();
map.put("DataTable", DataTable.class);
map.put("xs:schema", XsSchema.class);
map.put("diffgr:diffgram", DiffgrDiffgram.class);
于 2012-09-20T16:21:56.643 に答える