저는 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>
.
지금까지 다음을 사용했습니다.
$.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");
Rich는 다음과 같이 지적했습니다.
더 나은 솔루션은 이스케이프가 필요하지 않으며 모든 “최신”브라우저에서 작동합니다.
.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"]')
답변
위의 답변은 정확 해 보이지만 웹킷 브라우저 (Safari, Chrome)에서는 작동하지 않습니다. 더 나은 솔루션은 다음과 같습니다.
.find("[nodeName=z:myRow, myRow]")
답변
누군가가 jQuery없이 일반 자바 스크립트를 사용하고 Google 크롬 (웹킷)의 경우이를 수행해야하는 경우 많은 연구와 테스트 후에 이것이 작동하도록 찾은 유일한 방법입니다.
parentNode.getElementsByTagNameNS("*", "name");
다음 노드를 검색하는 데 작동합니다 <prefix:name>
.. 보시다시피 접두사 또는 네임 스페이스가 생략되었으며 태그 이름이 인 경우 다른 네임 스페이스의 요소와 일치합니다 name
. 그러나 이것이 당신에게 문제가되지 않기를 바랍니다.
이 중 어느 것도 나를 위해 일하지 않았습니다 (Google 크롬 확장 프로그램을 개발 중입니다).
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
편집 : 잠자기 후 작업 해결 방법을 찾았습니다. :)이 함수는 다음nodeName
과 같은전체와일치하는 첫 번째 노드를 반환합니다<prefix:name>
.
// 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에 대한 솔루션을 찾을 수있었습니다. 여기에서 Javascript XML Node Finding Performance 향상