2009-05-20 9 views
4

文字列をXMLとして扱いたいと思います。それから、jQuery.findを介してDOMで問い合わせることができます。 Firefoxではすべてがうまくいきましたが、IEでこれが動作していないことに気付きました。jQueryでDOMを使用してXML文字列をクエリする方法

私はこれをやっている:Firefox 3の

var t = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
    alert("[" + $(t).find("outer").html() + "]"); 

をそれが印刷さ:IE 7では

[<inner>abc</inner><inner>def</inner>] 

を、それが出力します。

[] 

これは全体の動作するように取得するための回避策をブラウザ?

ありがとうございました。

+0

これは実際のXMLですか?構文エラーが含まれているようです。 –

+0

Woops。私はXMLタグにマッチしませんでした。これは問題ではありません。質問はまだ立っています。 – Jono

+0

コード例でタグが一致しました。今より読みやすくなります。何か案は? – Jono

答えて

0

これはしばらくしていますが、私はあなたの組み合わせたアイデアでどのように問題を解決したのかを忘れてしまったことに気づきました。

完全にクライアント側のデータベース(PHPなし)が必要でした。

XMLを含むHTMLコメント付きのdivを作成しました。 I parsed the HTML comment with this、次にI converted the XML to JSON with this

var xmltext = $("#piecelist").comments(); 
    var json = $.xml2json(xmltext.html()); 

現在のアクションの私の方法を見ることができます: http://wesculpt.net/art.html

たぶん私はjQueryプラグインには、このメソッドを有効にしてください。

皆様のお手伝いをありがとうございます。セレンは、ブラウザでXMLファイルを読み込むための

JavaScriptで
1

最初に、jQueryコンストラクタはXMLではなくHTMLを取ります。つまり、あなたのXMLは機能するかもしれませんが、ブラウザに依存する多くの動作に依存します。また、あなたはどこかのページに隠し要素に新しく作成された要素を追加し、それを照会しようとすることで、より良い成功を持っていることがあります。

var xml = "<books><book><title>Title</title></book></books>"; 
$(xml).appendTo("#hidden"); 
alert($("#hidden books").length); 
+0

うん。あなたのアイデアは私にとって同じ結果を持っています。 FFでは動作しますが、IEでは動作しません。まあ、私はもっと大きな質問に言及します。 私はデータベースとして照会したいもののリストを持っています。しかし、私はこれをすべてクライアント側でやりたいつまり、私は.ajaxリクエストを作成できません。だから私はページ自体にXMLデータベースとしてリストを隠している。コメント内で、HTML divの内部にあります。ちょっと変だけど、このテーブルを維持する別の方法を見つけることができない。たぶん私は簡単な方法を見落としているでしょうか? – Jono

9

これにアプローチする2通りの方法があります。

  1. 、DOMへのXML文字列を変換し、このpluginを使用して、それを解析したり、このtutorial
  2. このpluginを使用してJSONをXMLに変換従ってください。
+0

ありがとうございます。これらは私が働くことを試みてきた2つの非常に良いプラグインです。 – Jono

+1

プラグインソースをチェックすると、ActiveXオブジェクトを使用してxml文字列をxmlオブジェクトに変換します。 – NLV

4

XMLをJSONとして保存することは可能でしょうか(私はそうするでしょう)?たとえば、PHPでは、XMLをArrayまたはObjectに変換してから、json_encodeのJSONに変換できます。あなたはそのようにのようなjavascriptの変数としてそれをエコー可能性:PHPで

<?php 
$xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
$xml_object = simplexml_load_string(xml); 
$json = json_encode($xml_object); 
?> 
<script language="javascript"> 
$(function() { 
    // eval() is okay to use if you know where the JSON is 
    // coming from (and, of course, you do...) 
    var data = eval('<?php echo $json; ?>'); 
    $(document).data('myapp.data',data); 
}); 
</script> 

そして、あなたがそのデータにアクセスする必要がある時はいつでも今、あなたはちょうどそうのようにそれを得ることができます。

function some_function() { 
    var data = $(document).data('myapp.data'); 
    $.each(data.div.outer,function() { 
     // Would alert 'abc' then 'def' 
     alert(this.inner); 
    }); 
} 

私はそれが意味をなさないことを望みます。少なくとも、クライアント側でXMLについては心配する必要はありません。あなたは絶対に必要な場合はもちろん、私はこれは、過去に私のために働いていることを発見しました: - わからない

var xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; 
var $xml = $('<div />').append(xml); 
alert("[" + $xml.find("outer").html() + "]"); 

編集 を私はあなたが提供する実際のXMLを使用するために自分のコードを修正しました私はそこに混ざりました(偶然に他人の答えからスニペットをつかんでいたに違いありません)。私の最初の提案は本当にすべきです - それはうまくいくはずです。

+0

クライアントサイドのalert()は "[null]"を生成します。 $ xml.find( "outer")を.find( "books")に置き換えると、FFで動作しますが、IEでは "@"が生成されます。これは、@Jonoが報告しているオリジナルの問題です。 –

+0

ああ、woops ...ハハ;私は文字列に完全なXMLを入れなかった。 IEの問題については、あまりにも悪いです。彼がJSONメソッドを試したのだろうかと思います。期待どおりに動作するはずです。 – KyleFarris

0

文字列xmlを使用すると、xmlノードツリーを認識したくないため、.filterを使用する必要があります。

ie8でthisを試してください。デバッガが表示され、コンソール出力が表示されます。

0

DOMにXMLデータセットを格納する代わりに、HTMLテーブルに変換して非表示にします。それはjQueryの問題を解決するはずです...少なくともブラウザ固有の問題。その後、セレクタを改良する作業に戻ります。

+0

非常にネストされたデータセットなので、HTMLテーブルを作ることはできません。これが私がXMLを使用している理由です。だから私はXMLを隠しdivに入れようとしました。 このメソッドを動作させたいが、以下の理由からこのメソッドは動作しない。自分のXMLタグがHTMLタグ(つまり、Title)と衝突しないようにする必要があります。だから私はこれを行うが、jQueryセレクタはIEでこれらのタグを見つけられない。 FFでは、作成されたタグを検索することができます。しかし、IEはHTMLのサブセットに制限されているようです。 – Jono

+0

ちょっとでも、テーブルを入れ子にすることもできます...とにかく、問題が長すぎて、どこにも行きませんか、それとも複雑すぎるのでしょうか?それは通常、間違った方向に行くことを意味します。JSONを使用して構造体をシリアライズしたり、Googleの歯車のようなものをクライアント上に保持する方が良いと思われます。 – Goyuix

+0

はい。私はJSONソリューションに取り組んでいます。私はあなたのGoogleギアへの参照が何を意味するのか不思議です。 – Jono

1

function loadXMLFromDOM2XMLString(xmlString, xmltag, currentChildNode) { 
var nodes = currentChildNode.childNodes; 
var i = 0 ; 
var node = nodes[i]; 
while (i < nodes.length) { 
    if (node.data == null) {xmltag = '<'+node.localName+'>';} else {xmltag = node.data;}; 
    xmlString = xmlString + xmltag; 
    xmlString = loadXMLFromDOM2XMLString(xmlString, xmltag, node ); 
    if (node.data == null) {xmltag = '<'+'/'+node.localName+'>';} else {xmltag = "";}; 
    xmlString = xmlString + xmltag; 
    i++; 
    node = nodes[i]; 
} 
return xmlString ; 
} ; 
var xmlString = ""; 
var xmltag = ""; 

var currentChildNode = window.document; 

xmlString = loadXMLFromDOM2XMLString(xmlString, xmltag, currentChildNode); 
xmlString; 
3

Javascriptの変数にXML文字列を入れてください:

var xmlString = $('<?xml version="1.0"?><Customers><Customer Name="Allan Border" Age="26" ContactNumber="004416165245" Address="Unit # 24 East London" City="London" Country="England"></Customer><Customer Name="Jennifer" Age="28" ContactNumber="004416165248" Address="Unit # 28 West London" City="London" Country="England"></Customer></Customers>'); 

今、あなたは、それぞれを反復して、XMLを解析することができます

$(xmlString).find("Customer").each(function() { 
var customerName = $(this).attr("Name"); 
var age = $(this).attr("Age"); 
var contactNumber = $(this).attr("ContactNumber"); 
var address = $(this).attr("Address"); 
var city = $(this).attr("City"); 
var country = $(this).attr("Country"); 
}); 
関連する問題