네임스페이스가 있는 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");
리치가 지적한 바와 같이:
더 나은 솔루션은 탈출할 필요가 없으며 모든 "현대" 브라우저에서 작동합니다.
.find("[nodeName=z:row]")
저는 플러그인과 모든 종류의 해결책에 대해 이 책을 읽는 데 몇 시간을 보냈지만 운이 없었습니다.
ArnisAndy는 jQuery 토론에 대한 링크를 게시했는데, 여기서 이 답변이 제공되며, 저는 이것이 jQuery(v1.7.2)를 사용하는 Chrome(v18.0), FireFox(v11.0), IE(v9.08) 및 Safari(v5.1.5)에서 사용할 수 있음을 확인할 수 있습니다.
콘텐츠 이름이 <content:encoded>인 WordPress 피드를 스크랩하려고 합니다. 이것이 저에게 효과적이었습니다.
content: $this.find("content\\:encoded, encoded").text()
jquery 1.5를 사용하는 경우 노드 선택기 속성 값 주변에 따옴표를 추가해야 작동할 수 있습니다.
.find('[nodeName="z:row"]')
위의 답변이 맞는 것 같지만 웹킷 브라우저(사파리, 크롬)에서는 작동하지 않습니다.더 나은 해결책은 다음과 같습니다.
.find("[nodeName=z:myRow, myRow]")
jQuery 없이, 일반 자바스크립트로, 그리고 Google Chrome(웹킷)의 경우, 이것이 많은 연구와 테스트 끝에 작동할 수 있는 유일한 방법입니다.
parentNode.getElementsByTagNameNS("*", "name");
를(를) 하는 데 할 수 .<prefix:name>
이 . 합니다인 경우 합니다.name
하지만 이것이 당신에게 문제가 되지 않기를 바랍니다.
이 중 어떤 것도 저에게 효과가 없었습니다(Google Chrome 확장 기능을 개발하고 있습니다).
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
편집: 잠을 좀 자고 나서 해결 방법을 찾았습니다. :) 이 함수는 첫번째 노드가 full과 일치하는 것을 반환합니다.nodeName
를 들면s<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에 대한 솔루션을 찾을 수 있었습니다. 여기서:자바스크립트 XML 노드 찾기 성능 향상
jQuery 1.7에서 네임스피드 요소를 찾기 위한 몇 가지 해결 방법에 문제가 있다는 것을 주목할 필요가 있습니다.자세한 내용은 다음 링크를 참조하십시오.
- jQuery Bug Ticket은 .find('[nodeName="z:row"]) 기능에 대한 browser 간 지원이 부족하다는 점을 지적합니다.
- 몇 가지 성능 테스트를 통해 제안하는 플러그인 해결 방법입니다.
주석에서 해결책을 찾았습니다. jQuery($)를 사용하여 XML을 네임스페이스로 파싱합니다. find.
콜론 이후 노드 이름의 후반부를 사용하는 것이 나에게 효과가 있었습니다..find("geo\":lat") 대신 .find("lat")를 사용했는데 저에게 효과가 있었습니다.
내 설정:
- 크롬42
- jQuery 2.1.3
샘플 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@example.com" primary="true"/>
</entry>
구문 분석 코드:
var xmlDoc = $.parseXML( xml );
var $xml = $( xmlDoc );
var $emailNode = $xml.find( "email" );
$("#email").html($emailNode.attr("address"));
Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview
jQuery 1.7은 다음과 같이 작동하지 않습니다.
$(xml).find("[nodeName=a:IndexField2]")
제가 Chrome, Firefox, IE에서 작동하게 된 한 가지 해결책은 IE에서 작동하는 선택기와 Chrome에서 작동하는 선택기를 사용하는 것입니다. 한 가지 방법은 IE에서 작동하고 다른 방법은 Chrome에서 작동한다는 사실에 근거하여:
$(xml).find('a\\\\:IndexField2, IndexField2')
IE에서는 네임스페이스를 사용하여 노드를 반환하고(파이어폭스 및 IE에서는 네임스페이스가 필요함), 크롬에서는 선택기가 네임스페이스가 아닌 선택기를 기반으로 노드를 반환합니다.사파리에서 테스트해 본 적은 없지만 크롬에서 작동하기 때문에 작동할 것입니다.
(PHP 프록시를 사용하기 때문에) 제 해결책은 네임스페이스를 _...로 대체하는 것입니다. 따라서 네임스페이스 문제는 더 이상 발생하지 않습니다.
간단해요!
Original Answer : jQuery XML 파싱 요소 속성을 가져오는 방법
Chrome에서 성공적으로 가치를 얻는 방법에 대한 예시가 있습니다.
item.description = jQuery(this).find("[nodeName=itunes\\:summary]").eq(0).text();
2016년 초 현재, 저에게 다음 구문은 jQuery 1.12.0과 함께 작동합니다.
- IE 11 (11.0.9600.18204, 11.0.28, KB3134815):
.find("z\\:row")
- Firefox 44.0.2:
.find("z\\:row")
- 44.0.2403.89m:
.find("row")
.find("[nodeName=z:row]")
위에 언급한 브라우저 중 어느 곳에서도 작동하지 않습니다.크롬에서 네임스페이스를 적용할 방법을 찾지 못했습니다.
것을 과 같은 합니다: 합니다..find("row,z\\:row")
위에 언급한 바와 같이 현재 브라우저/jQuery 버전의 경우 위 솔루션에 문제가 있습니다 - 케이스 문제로 인해 제안된 플러그인도 완전히 작동하지 않습니다 (nodeName
, 속성으로서, 때로는 모든 상위의 경우에 해당합니다.)그래서 저는 다음과 같은 빠른 함수를 썼습니다.
$.findNS = function (o, nodeName)
{
return o.children().filter(function ()
{
if (this.nodeName)
return this.nodeName.toUpperCase() == nodeName.toUpperCase();
else
return false;
});
};
Example usage:
$.findNS($(xml), 'x:row');
내용:$this.find("content\\:encoded, encoded").text()
is the perfect solution...
There is a plugin jquery-xmlns for jQuery to work with namespaces in selectors.
I have not seen any documentation on using JQuery to parse XML. JQuery typically uses the Browser dom to browse an HTML document, I don't believe it reads the html itself.
You should probably look at the built in XML handling in JavaScript itself.
http://www.webreference.com/programming/javascript/definitive2/
just replaced the namespace by empty string. Works fine for me. Tested solution across browsers: Firefox, IE, Chrome
My task was to read and parse an EXCEL-file via Sharepoint EXCEL REST API. The XML-response contains tags with "x:" namespace.
I decided to replace the namespace in the XML by an empty string. Works this way: 1. Get the node of interest out of the XML-response 2. Convert the selected node XML-Response (Document) to String 2. Replace namespace by empty string 3. Convert string back to XML-Document
See code outline here -->
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
}
For XML-to-String conversion find a solution here: http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string
Alternatively, you can use fast-xml-parser in your project, and convert the XML data into JS/JSON object. Then you can use it as object property. It doesn't use JQuery or other libraries but it'll solve your purpose.
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/js로 구문 분석하는 동안 네임스페이스를 무시할 수 있습니다.이 경우 다음과 같이 직접 액세스할 수 있습니다.jsObj.xml.data.row
.
for(var i=0; i< jsObj.xml.data.row.length; i++){
console.log(jsObj.xml.data.row[i]);
}
Disclaimer: I've created fast-xml-parser.
웹킷 브라우저의 경우 콜론을 그냥 생략할 수 있습니다.찾으려면<media:content>
예를 들어 RSS 피드에서 다음을 수행할 수 있습니다.
$(this).find("content");
ReferenceURL : https://stackoverflow.com/questions/853740/how-to-use-jquery-for-xml-parsing-with-namespaces
'programing' 카테고리의 다른 글
오라클 프로시저에서 서버 출력 설정 (0) | 2023.09.24 |
---|---|
팬더 데이터 프레임을 신청하기 위해 람다를 전달하는 데 문제가 있음 (0) | 2023.09.24 |
MYSQL LIMIT 키워드에 대한 ANSI SQL 대안이 있습니까? (0) | 2023.09.24 |
C 및 C++ 포인터 표기에서 별을 넣을 위치 (0) | 2023.09.24 |
중앙의 이미지 정렬을 위한 CSS (0) | 2023.09.19 |