前提・実現したいこと
以下のようなXMLをJavaScriptで取得した場合、
JavaScript
1 <var xml = `<?xml version="1.0" encoding="UTF-8"?> 2 <city> 3 <shops> 4 <shop> 5 <id>1</id> 6 <name>shopA</name> 7 </shop> 8 </shops> 9 <shops> 10 <shop> 11 <id>2</id> 12 <name>shopB</name> 13 </shop> 14 </shops> 15 <shops> 16 <shop> 17 <id>3</id> 18 <name>shopA</name> 19 </shop> 20 </shops> 21 </city>
nameタグの値が重複しているタグをshops単位で削除して一意にして、以下のようにしたいのですが、
どのようなコードを組めばよいでしょうか?
ちなみにshopsはルートに1つ置くのではなく、コードに提示しているようにshop単位で置かれる仕様で考えています。
今回のXMLでは、shopA,shopB,shopAの3つしか存在しませんが、実際は任意にshops単位でshopがあるものを想定しています。
JavaScript
1 <var xml = `<?xml version="1.0" encoding="UTF-8"?> 2 <city> 3 <shops> 4 <shop> 5 <id>1</id> 6 <name>shopA</name> 7 </shop> 8 </shops> 9 <shops> 10 <shop> 11 <id>2</id> 12 <name>shopB</name> 13 </shop> 14 </shops> 15 </city>
また、今回の例ではidが1のほうのshopAを残しましたが、idが1のほうが消えて、idが3のほうのshopAが残る処理でも大丈夫です。
ご教示お願い致します。
試したこと
XMLの取得においては、jQueryを導入したほうが簡単に扱えそうだったので、jQueryを使ってXMLを処理することに決めました。
基本的なXMLの取得までの処理はわかりました。
・test.html
JavaScript
1 <script src="http://code.jquery.com/jquery.min.js"></script> 2 <script> 3 <var xml = `<?xml version="1.0" encoding="UTF-8"?> 4 <city> 5 <shops> 6 <shop> 7 <id>1</id> 8 <name>shopA</name> 9 </shop> 10 </shops> 11 <shops> 12 <shop> 13 <id>2</id> 14 <name>shopB</name> 15 </shop> 16 </shops> 17 <shops> 18 <shop> 19 <id>3</id> 20 <name>shopA</name> 21 </shop> 22 </shops> 23 </city>`; 24 25 var xmlDoc = $.parseXML(xml); 26 var city = $(xmlDoc).children("city") 27 <script>
デバッグ方法は、上記htmlファイルをChromeのログで見ているだけです。
console.logで結果を確認します。
shops単位でループさせて、重複をチェックと考えましたが、
var xmlDoc = $.parseXML(xml); $(xmlDoc).children("city").children("shops").each(function(){ console.log($(this).html()); });
XMLによっては、以下のように同名のshopsが3回以上出現する場合もありうることに気づき、
どういった処理にしたらよいか見当がつかない状態です。
ループで回すというよりも、C#のLinqのDistinctメソッドのようなものがJavaScript、もしくはjQueryに存在すれば、
それを使うという処理になるのでしょうか?
JavaScript
1 <var xml = `<?xml version="1.0" encoding="UTF-8"?> 2 <city> 3 <shops> 4 <shop> 5 <id>1</id> 6 <name>shopA</name> 7 </shop> 8 </shops> 9 <shops> 10 <shop> 11 <id>2</id> 12 <name>shopB</name> 13 </shop> 14 </shops> 15 <shops> 16 <shop> 17 <id>3</id> 18 <name>shopA</name> 19 </shop> 20 </shops> 21 <shops> 22 <shop> 23 <id>4</id> 24 <name>shopA</name> 25 </shop> 26 </shops> 27 </city>
追記修正
質問の仕様が不明確で申し訳ありません。
nameが重複するshopは、idでも重複します。
以下のような可能性が考えられます。
city直下のshopsがユニークであることを期待します。
JavaScript
1 <var xml = `<?xml version="1.0" encoding="UTF-8"?> 2 <city> 3 <shops> 4 <shop> 5 <id>1</id> 6 <name>shopA</name> 7 </shop> 8 </shops> 9 <shops> 10 <shop> 11 <id>2</id> 12 <name>shopB</name> 13 </shop> 14 </shops> 15 <shops> 16 <shop> 17 <id>1</id> 18 <name>shopA</name> 19 </shop> 20 </shops> 21 <shops> 22 <shop> 23 <id>1</id> 24 <name>shopA</name> 25 </shop> 26 </shops> 27 </city>
回答1件
あなたの回答
tips
プレビュー