[解決済み] 複数の子ノードを持つxmlファイルの読み込み
2022-02-19 02:15:24
質問
以下のようなXMLファイルがあるとします。
<top>
<CRAWL>
<NAME>div[class=name],attr=0</NAME>
<PRICE>span[class~=(?i)(price-new|price-old)],attr=0</PRICE>
<DESC>div[class~=(?i)(sttl dyn|bin)],attr=0</DESC>
<PROD_IMG>div[class=image]>a>img,attr=src</PROD_IMG>
<URL>div[class=name]>a,attr=href</URL>
</CRAWL>
<CRAWL>
<NAME>img[class=img],attr=alt</NAME>
<PRICE>div[class=g-b],attr=0</PRICE>
<DESC>div[class~=(?i)(sttl dyn|bin)],attr=0</DESC>
<PROD_IMG>img[itemprop=image],attr=src</PROD_IMG>
<URL>a[class=img],attr=href</URL>
</CRAWL>
</top>
タグの中に入ってくる値を使って、他の関数をしています。それぞれ別の値を持っていて、その値を別の操作に使っています。
よろしくお願いします
解決方法は?
私の理解が正しければ、XMLフラグメント内に存在するすべてのタグからデータを抽出しようとしているのですね。これには複数の解決策があります。以下にそれらを列挙します。
-
XPath。XMLの構造が正確に分かっている場合、各ノード=CRAWLに対してXPathを採用することで、タグ内のデータを検索することができます。
// Instantiate XPath variable XPath xpath = XPathFactory.newInstance().newXPath(); // Define the exact XPath expressions you want to get data for: XPathExpression name = xpath.compile("//top/CRAWL/NAME/text()"); XPathExpression price = xpath.compile("//top/CRAWL/PRICE/text()"); XPathExpression desc = xpath.compile("//top/CRAWL/DESC/text()"); XPathExpression prod_img = xpath.compile("//top/CRAWL/PROD_IMG/text()"); XPathExpression url = xpath.compile("//top/CRAWL/URL/text()");
この時点で、上記の各変数は、各タグのデータが入っていることになります。これをそれぞれの配列に落とし込むと、すべての要素に各タグのデータが入ることになります。
-
もう1つの(より効率的な)解決策は、DOMベースのパージングを行うことでデータを保存させることです。
// Instantiate the doc builder DocumentBuilder xmlDocBuilder = domFactory.newDocumentBuilder(); Document xmlDoc = xmlDocBuilder.parse("xmlFile.xml"); // Create NodeList of element tag "CRAWL" NodeList crawlNodeList = xmlDoc.getElementsByTagName("CRAWL"); // Now iterate through each item in the NodeList and get the values of // each of the elements in Name, Price, Desc etc. for (Node node: crawlNodeList) { NamedNodeMap subNodeMap = node.getChildNodes(); int currentNodeMapLength = subNodeMap.getLength(); // Get each node's name and value for (i=0; i<currentNodeMapLength; i++){ // Iterate through all of the values in the nodeList, // e.g. NAME, PRICE, DESC, etc. // Do something with these values } }
お役に立てれば幸いです。
関連
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] XMLを解析して、特定のノード属性のインスタンスをカウントするには?
-
[解決済み] Androidでファイルをダウンロードし、ProgressDialogで進捗を表示する。
-
[解決済み] Javaでプレーンテキストファイルを読み込む
-
[解決済み] XMLの要素とノードはどう違うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み】intがnullであるかどうかを確認する方法