私はjQueryが初めてなので、xmlドキュメントを解析したいと思います。
デフォルトの名前空間で通常のXMLを解析できますが、次のようなxmlを使用できます。
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-Microsoft-com:rowset" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
<s:datatype dt:type="i4" dt:maxLength="4" />
</s:AttributeType>
<s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
<s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
<s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />
<z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />
<z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />
</rs:data>
</xml>
本当に欲しいのは<z:row>
's。
これまで、私はやっています:
$.get(xmlPath, {}, function(xml) {
$("rs:data", xml).find("z:row").each(function(i) {
alert("found zrow");
});
}, "xml");
本当に運がありません。何か案は?ありがとう。
わかった。
\\
コロンをエスケープします。
$.get(xmlPath, {}, function(xml) {
$("rs\\:data", xml).find("z\\:row").each(function(i) {
alert("found zrow");
});
}, "xml");
リッチが指摘したように:
より良い解決策は、エスケープを必要とせず、すべての「モダン」ブラウザで機能します。
.find("[nodeName=z:row]")
プラグインとあらゆる種類のソリューションについて、この記事を読むのに数時間費やしました。
ArnisAndyはjQueryディスカッションへのリンクを投稿しました。この回答が提供されており、Chrome(v18.0)、FireFox(v11.0)、IE(v9.08)、Safari(v5.1.5)でこれが機能することを確認できます)jQuery(v1.7.2)を使用します。
コンテンツが<content:encoded>という名前のWordPressフィードをスクレイピングしようとしていますが、これは私のために働いたものです:
content: $this.find("content\\:encoded, encoded").text()
Jquery 1.5を使用している場合は、ノードセレクター属性値を引用符で囲んで機能させる必要があります。
.find('[nodeName="z:row"]')
上記の答えは正しいようですが、Webkitブラウザー(Safari、Chrome)では機能しません。私が信じるより良い解決策は:
.find("[nodeName=z:myRow, myRow]")
誰かがこれを行う必要がある場合jQueryなし、通常のJavascriptで、そしてGoogle Chrome(webkit)の場合、これが唯一ですたくさんの調査とテストを行った後、機能するようになりました。
parentNode.getElementsByTagNameNS("*", "name");
これは、ノード_<prefix:name>
_を取得するために機能します。ご覧のとおり、プレフィックスまたは名前空間は省略されており、タグ名がname
であれば、異なる名前空間を持つ要素と一致します。しかし、うまくいけば、これはあなたにとって問題にならないでしょう。
これは私には役に立たなかった(Googleを開発中Chrome拡張機能):
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
編集:スリープ後、回避策が見つかりました :)この関数は最初の_<prefix:name>
_などの完全なnodeName
に一致するノード:
_// Helper function for nodes names that include a prefix and a colon, such as "<yt:rating>"
function getElementByNodeName(parentNode, nodeName)
{
var colonIndex = nodeName.indexOf(":");
var tag = nodeName.substr(colonIndex + 1);
var nodes = parentNode.getElementsByTagNameNS("*", tag);
for (var i = 0; i < nodes.length; i++)
{
if (nodes[i].nodeName == nodeName) return nodes[i]
}
return undefined;
}
_
一致するすべての要素を返す必要がある場合は、簡単に変更できます。それが役に立てば幸い!
上記のソリューションはどれもうまくいきません。これを見つけて、速度が改善されました。これを追加するだけで、魅力のように機能します:
$.fn.filterNode = function(name) {
return this.find('*').filter(function() {
return this.nodeName === name;
});
};
使用法:
var ineedthatelementwiththepsuedo = $('someparentelement').filterNode('dc:creator');
「\\」エスケープは絶対確実ではなく、単純な
.find('[nodeName="z:row"]')
メソッドはJquery 1.7の時点で壊れているようです。ここで、フィルター関数を使用して1.7のソリューションを見つけることができました: Improving Javascript XML Node Finding Performance
JQuery 1.7の時点では、名前空間付き要素を見つけるための回避策のいくつかに問題があったことは注目に値します。詳細については、次のリンクを参照してください。
コメントで解決策を見つけました: jQuery $()。findを使用して名前空間でXMLを解析します
コロンが機能した後、ノード名の後半を使用しました。 。find( "geo \:lat")の代わりに。find( "lat")を使用しました。
私のセットアップ:
サンプルXML(Google Contacts APIのスニペット):
<entry>
<id>http://www.google.com/m8/feeds/contacts/mstefanow%40gmail.com/base/0</id>
<Gd:email rel="http://schemas.google.com/g/2005#other" address="[email protected]" primary="true"/>
</entry>
解析コード:
var xmlDoc = $.parseXML( xml );
var $xml = $( xmlDoc );
var $emailNode = $xml.find( "email" );
$("#email").html($emailNode.attr("address"));
jQuery 1.7は以下では機能しません。
$(xml).find("[nodeName=a:IndexField2]")
Chrome、Firefox、およびIEで動作するようになった解決策の1つは、IE一方の方法がIEともう一方がChromeで機能するという事実:
$(xml).find('a\\\\:IndexField2, IndexField2')
IEでは、これは名前空間を使用してノードを返し(FirefoxおよびIE名前空間が必要)、Chromeでは、セレクタは非名前空間セレクタに基づいてノードを返します。Safariではこれをテストしていません、ただし、Chromeで動作しているので動作するはずです。
元の回答: jQuery XMLは要素属性を取得する方法を解析します
Chromeで値を正常に取得する方法の例を次に示します。
item.description = jQuery(this).find("[nodeName=iTunes\\:summary]").eq(0).text();
2016年初頭、私にとって、次の構文はjQuery 1.12.0で機能します。
.find("z\\:row")
.find("z\\:row")
.find("row")
構文.find("[nodeName=z:row]")
は、上記のどのブラウザーでも機能しません。 Chromeで名前空間を適用する方法が見つかりませんでした。
すべてをまとめると、上記のすべてのブラウザで次の構文が機能します:.find("row,z\\:row")
私の解決策は(Phpプロキシを使用しているため)、名前空間を_で置き換えることです... ...
複雑にしないでおく !
プラグインがあります jquery-xmlns jQueryがセレクターのネームスペースで動作するためです。
内容:$this.find("content\\:encoded, encoded").text()
完璧なソリューションです...
上記のように、現在のブラウザー/バージョンのjQueryには上記のソリューションに問題があります-ケースの問題のために提案されたプラグインは完全に機能しません(プロパティとしてのnodeName
大文字)。そこで、次のクイック関数を作成しました。
$.findNS = function (o, nodeName)
{
return o.children().filter(function ()
{
if (this.nodeName)
return this.nodeName.toUpperCase() == nodeName.toUpperCase();
else
return false;
});
};
使用例:
$.findNS($(xml), 'x:row');
JQueryを使用したXMLの解析に関するドキュメントを見たことはありません。 JQueryは通常、ブラウザdomを使用してHTMLドキュメントを参照しますが、html自体を読み取るとは思いません。
JavaScript自体に組み込まれているXML処理を確認する必要があります。
http://www.webreference.com/programming/javascript/definitive2/
名前空間を空の文字列に置き換えただけです。私にとってはうまくいきます。ブラウザ間でテスト済みのソリューション:Firefox、IE、Chrome
私の仕事は、Sharepoint Excel RESTAPI。XML応答には、「x:」名前空間を持つタグが含まれています。
XMLの名前空間を空の文字列に置き換えることにしました。この方法で動作します。1. XML応答から目的のノードを取得します。2.選択したノードXML-Response(ドキュメント)を文字列に変換します。2.名前空間を空の文字列に置き換えます。
コードの概要はこちら->
function processXMLResponse)(xData)
{
var xml = TOOLS.convertXMLToString("", "",$(xData).find("entry content")[0]);
xml = xml.replace(/x:/g, ""); // replace all occurences of namespace
xData = TOOLS.createXMLDocument(xml); // convert string back to XML
}
XMLから文字列への変換については、こちらで解決策を見つけてください。 http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string
または、プロジェクトで fast-xml-parser を使用し、XMLデータをJS/JSONオブジェクトに変換できます。その後、オブジェクトプロパティとして使用できます。 JQueryやその他のライブラリは使用しませんが、目的は解決します。
var xmlData = '<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-Microsoft-com:rowset" xmlns:z="#RowsetSchema">'
+' <s:Schema id="RowsetSchema">'
+' <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">'
+' <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">'
+' <s:datatype dt:type="i4" dt:maxLength="4" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' </s:ElementType>'
+' </s:Schema>'
+' <rs:data>'
+' <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />'
+' <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />'
+' <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />'
+' </rs:data>'
+'</xml>'
var jsObj = parser.parse(xmlData,{attrPrefix:"",ignoreTextNodeAttr: false});
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][0],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][1],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][2],null,4) + "<br>");
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/2.9.2/parser.min.js"></script>
Js/jsonオブジェクトへの解析中に名前空間を無視できます。この場合、jsObj.xml.data.row
として直接アクセスできます。
for(var i=0; i< jsObj.xml.data.row.length; i++){
console.log(jsObj.xml.data.row[i]);
}
免責事項:fast-xml-parserを作成しました。