0

Google Contacts API から XML を解析しようとしています。私とこの質問に関連する部分は、名、姓、および電子メールアドレスであり、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005">
<entry>
  <gd:name>
    <gd:fullName>John Doe</gd:fullName>
    <gd:givenName>John</gd:givenName>
    <gd:familyName>Doe</gd:familyName>
  </gd:name>
  <gd:email rel="http://schemas.google.com/g/2005#work" address="john.doe@example.org" primary="true"/>
</entry>
<entry>
  <gd:name>
    <gd:fullName>Jane Smith</gd:fullName>
    <gd:givenName>Jane</gd:givenName>
    <gd:familyName>Smith</gd:familyName>
  </gd:name>
  <gd:email rel="http://schemas.google.com/g/2005#work" address="jane.smith@foo.bar" primary="true"/>
</entry>
</feed>

私のダイジェスタークラスは次のようになります。

public class GmailContactsDigester {
  private Digester digester;

  public GmailContactsDigester() {
    digester = new Digester();
    digester.addObjectCreate("feed", ArrayList.class);
    digester.addObjectCreate("feed/entry", GoogleContact.class);
    digester.addBeanPropertySetter("feed/entry/gd:name/gd:givenName", "givenName");
    digester.addBeanPropertySetter("feed/entry/gd:name/gd:familyName", "familyName");
    digester.addRule("feed/entry/gd:email/", new SetPropertiesRule("address", "email"));
    digester.addSetNext("feed/entry", "add");
  }

  public List<GoogleContact> parse(InputStream xmlStream) {
    try {
      return (List<GoogleContact>) digester.parse(xmlStream);
    } catch (IOException e) {
      throw new RuntimeException(e);
    } catch (SAXException e) {
      throw new RuntimeException(e);
    }
  }
}

クラスは、GoogleContact必要なフィールドとセッターを備えた小さなドメイン オブジェクトです。

これはすべて正常に機能しますが、XML で使用される名前空間プレフィックスに依存します。名前空間に関係なく、要素のローカル名だけで機能するようにしたいと思います。それ、どうやったら出来るの?「feed/entry/*:email」や「feed/entry/email」など、Bean プロパティ セッターのパターンのさまざまな構文を試しましたが、うまくいきません。

4

1 に答える 1

1

解決策は、Digester名前空間を認識させ、ルール マッチングで名前空間を無視するようにすることでした。

public GmailContactsDigester() {
  digester = new Digester();
  digester.setRuleNamespaceURI(null);
  digester.setNamespaceAware(true);
  digester.addObjectCreate("feed", ArrayList.class);
  digester.addObjectCreate("feed/entry", GoogleContact.class);
  digester.addBeanPropertySetter("feed/entry/name/givenName");
  digester.addBeanPropertySetter("feed/entry/name/familyName");
  digester.addRule("feed/entry/email/", new SetPropertiesRule("address", "email"));
  digester.addSetNext("feed/entry", "add");
}
于 2013-12-03T08:29:08.347 に答える