現在、Javaアプリケーションは、タブで区切られた* .cfgファイル内に保持されている値を使用します。このアプリケーションがXMLファイルを使用するように変更する必要があります。
このファイルから値を読み込むために使用するのに最適なライブラリは何ですか?
もちろん、必要なものに基づいて多くの優れたソリューションがあります。構成だけの場合は、ジャカルタ commons-configuration および commons-digester をご覧ください。
常にドキュメントを取得する標準のJDKメソッドを使用できます。
import Java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
[...]
File file = new File("some/path");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
XMLコード:
<?xml version="1.0"?>
<company>
<staff id="1001">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff id="2001">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
Javaコード:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import Java.io.File;
public class ReadXMLFile {
public static void main(String argv[]) {
try {
File fXmlFile = new File("/Users/mkyong/staff.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("staff");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Staff id : "
+ eElement.getAttribute("id"));
System.out.println("First Name : "
+ eElement.getElementsByTagName("firstname")
.item(0).getTextContent());
System.out.println("Last Name : "
+ eElement.getElementsByTagName("lastname")
.item(0).getTextContent());
System.out.println("Nick Name : "
+ eElement.getElementsByTagName("nickname")
.item(0).getTextContent());
System.out.println("Salary : "
+ eElement.getElementsByTagName("salary")
.item(0).getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
出力:
----------------
Root element :company
----------------------------
Current Element :staff
Staff id : 1001
First Name : yong
Last Name : mook kim
Nick Name : mkyong
Salary : 100000
Current Element :staff
Staff id : 2001
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000
これを読むことをお勧めします: DOM構文解析のJava-どのように機能しますか?
XML構成ファイルを選択した特別な理由はありますか?私は過去にXML設定を行ってきましたが、多くの場合、他の何よりも頭痛の種であることが判明しています。
私の本当の疑問は、 Preferences API のようなものを使用することがあなたの状況でよりうまくいくかどうかだと思います。
独自のXMLソリューションでPreferences APIを使用する理由:
典型的なXMLのさ(DocumentFactoryなど)を回避し、サードパーティライブラリを回避してXMLバックエンドを提供します
デフォルト値の組み込みサポート(欠落/破損/無効なエントリに特別な処理は不要)
XMLストレージの値をサニタイズする必要はありません(CDATAラッピングなど)
バッキングストアの保証されたステータス(XMLをディスクに常に書き込む必要はありません)
バッキングストアは構成可能です(ディスク上のファイル、LDAPなど)
すべての設定へのマルチスレッドアクセスは無料
このファイルから値を読み込むために使用するのに最適なライブラリは何ですか?
simplestライブラリを求めているので、 Guillaumeのトップ投票の回答 。(他の回答の中で、sjbothaのJDOMの言及が最も近い私が提案するものに)。
JavaでのXML処理では、標準のJDKツールを使用することは確かにnot最も簡単な方法であり、それは特定の状況(サードパーティのライブラリを使用できないなど、何らかの理由で)それが最善の方法です。
代わりに、 [〜#〜] xom [〜#〜] などの適切なXMLライブラリの使用を検討してください。 nu.xom.Document
オブジェクトへのXMLファイル:
import nu.xom.Builder;
import nu.xom.Document;
import Java.io.File;
[...]
File file = new File("some/path");
Document document = new Builder().build(file);
そのため、「純粋なJDK」アプローチでは、ファイルをorg.w3c.dom.Document
に読み込むこともそれほど複雑ではなかったため、これはほんの少し単純でした。しかし、良いライブラリを使用する利点はここから始まります! XMLで何をしていても、XOMなどのライブラリを使用すると、多くの場合、はるかに単純なソリューションを使用して、維持する独自のコードを減らすことができます。例として、 this vs. this 、または this vs. this 、または XOMとW3C DOMの両方の例を含むこの投稿 。
他の人は、Javaの標準XML APIに固執する価値がある理由について反論( これらの のような)を提供します-個人的に私はそれらのすべてを購読していませんが、少なくともいくつかの場合、これらにはおそらくメリットがありますいずれにせよ、いずれかの方法を選択するときは、ストーリーの両側に注意するのが良いでしょう。
(この答えは、私の dom4j を置き換える最適なJava XMLライブラリを見つけるための探求の強力な候補であるXOMの評価の一部です。)
[〜#〜] jaxb [〜#〜] は簡単に使用でき、Java 6 SE。に含まれています。JAXB、またはSimpleなどの他のXMLデータバインディングXMLを自分で処理する必要はなく、ほとんどの作業はライブラリによって行われます。基本的な使用法は、既存のPOJOに注釈を追加することです。これらの注釈は、データのXMLスキーマの生成に使用されますファイルから/へのデータの読み取り/書き込み。
[〜#〜] jaxb [〜#〜] を調べます。
Jdomのみを使用しました。とても簡単です。
ドキュメントをダウンロードしてダウンロードするには、こちらにアクセスしてください。 http://www.jdom.org/
非常に大きなドキュメントがある場合は、すべてをメモリに読み込まずに、特定のタグと属性にヒットしたときにメソッドを呼び出すSAXパーサーを使用することをお勧めします。次に、着信コールを処理するステートマシンを作成する必要があります。
アプリケーションとcfgファイルのスコープによっては、プロパティファイルが最も簡単な場合があります。確かにxmlほどエレガントではありませんが、確かに簡単です。
つかいます - Java.beans.XMLDecoder
、コアの一部Java 1.4以降のSE。
XMLDecoder input = new XMLDecoder(new FileInputStream("some/path.xml"));
MyConfig config = (MyConfig) input.readObject();
input.close();
設定ファイルを手動で書き込む 、またはセットアップ時に対応する XMLEncoder
を使用して実行時に新しいオブジェクトを書き込むのは簡単です。
最も単純なものはSimple http://simple.sourceforge.net であり、そのように単一のオブジェクトに注釈を付けるだけです。
@Root
public class Entry {
@Attribute
private String a
@Attribute
private int b;
@Element
private Date c;
public String getSomething() {
return a;
}
}
@Root
public class Configuration {
@ElementList(inline=true)
private List<Entry> entries;
public List<Entry> getEntries() {
return entries;
}
}
次に、ファイル全体を読み取るために行う必要があるのは、場所を指定するだけで、注釈付きのPOJOを解析して入力します。これにより、すべての型変換と検証が行われます。必要に応じて、永続化コールバックに注釈を付けることもできます。それを読むことはそうすることができます。
Serializer serializer = new Persister();
Configuration configuraiton = serializer.read(Configuration.class, fileLocation);
これは私が使用するものです。 http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-Java.html 標準のJDKツールの上にあるため、常にJDKバージョンを使用できる機能がいくつか欠落しています。
これにより、本当に簡単になります。旧バージョンのソフトウェアによって保存された構成ファイル、またはユーザーが手動で編集した構成ファイルを読んでいるときは特に素晴らしいです。これは非常に堅牢であり、一部のデータが期待どおりの形式でない場合でも例外をスローしません。