[javascript] 네임 스페이스로 XML 구문 분석에 jQuery를 사용하는 방법

저는 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');

출처 : http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/


답변

“\\”이스케이프는 완전하고 간단하지 않습니다.

.find('[nodeName="z:row"]')

Jquery 1.7에서 메소드가 손상된 것 같습니다. 필터 함수를 사용하여 1.7에 대한 솔루션을 찾을 수있었습니다. 여기에서 Javascript XML Node Finding Performance 향상