SnakeYAML と同様のメソッドを使用して、基本的な XMLConfig に取り組んできました。
私は 2 つの問題に遭遇しました: オブジェクトへの多層パスを作成するかどうかわかりません。また、パスから実際のオブジェクトを読み取る方法もわかりません (タイプを指定しない限り、たとえば文字列)。DOM を使用して構成ファイルを解析しています。
問題 1: わかりました。次のような結果が得られました。
public String getString(String string, String def) { return getRootElement().getElementsByTagName(string).item(0) == null || getRootElement().getElementsByTagName(string).item(0).getTextContent().equalsIgnoreCase("") ? def : getRootElement().getElementsByTagName(string).item(0).getTextContent(); }
これは機能します (そこにない限り、チェックを行ったにもかかわらず NPE を取得しますか?)、ただし、1 つのレイヤーに対してのみ機能します (それが正しい用語である場合)。
例:
<root>
<somestring>hello!</somestring></root>
getString("somestring", null) を使用して、somestring の値を取得できます。
ただし、次のような場合:
<root>
<somestrings>
<string>Hey!</string>
<string2>Hola!</string>
</somestrings>
ノードリストを取得し、それを文字列リストに変換してから、必要なものを取得しない限り、stringまたはstring2を取得する方法はありません。どういうわけか文字列リストを返し、そのリストにすべての結果を追加したいのですが、それは簡単ですが、パスはどうでしょうか? 子をループする回数を知るにはどうすればよいですか? getString("somestrings.string", null) を行う何らかの方法が必要です。
問題 2: 文字列リストを取得できますが、オブジェクトを取得するにはどうすればよいでしょうか? 私はこの方法を持っています:
public List<String> getStringList(String string) {
return XMLUtils.NodeListToStringList(getRootElement().getElementsByTagName(string));
}
XMLUtils.NodeListToStringList() は次のとおりです。
public static List<String> NodeListToStringList(NodeList n) {
List<String> toReturn = Lists.newArrayList();
if (n == null) return toReturn;
for (int i = 0; i < n.getLength(); i++) {
toReturn.add(n.item(i).getTextContent());
}
return toReturn;
}
どうすれば同じことを行い、オブジェクト リストを返すことができるでしょうか? ここで何かを見逃していることは確かです。