jquery解析xml和按元素值

问题描述:

我有我使用jquery解析的以下xml。jquery解析xml和按元素值

但是我坚持只显示按标题分组的城市和日期。 我如何解析XML使最终输出会是这样

测试赛1 - 奥斯陆(2011/08/11),达拉斯(2011/11/11)

测试赛2 - 新纽约(...),西雅图(...)

任何帮助,将不胜感激,

感谢, 特里

<root> 
    <item guid="np_108886"> 
     <title>Test event 1</title> 
     <description>lorem ipsum</description> 
     <specfields> 
      <city>oslo</city> 
      <startdate>2011/08/11</startdate> 
     </specfields> 
    </item> 

    <item guid="np_108886"> 
     <title>Test event 1</title> 
     <description>lorem ipsum</description> 
     <specfields> 
      <city>dallas</city> 
      <startdate>2011/11/11</startdate> 
     </specfields> 
    </item> 

    <item guid="np_108886"> 
     <title>Test event 2</title> 
     <description>lorem ipsum</description> 
     <specfields> 
      <city>new york</city> 
      <startdate>2011/09/11</startdate> 
     </specfields> 
    </item> 
    <item guid="np_108886"> 
     <title>Test event 2</title> 
     <description>lorem ipsum</description> 
     <specfields> 
      <city>seattle</city> 
      <startdate>2011/09/11</startdate> 
     </specfields> 
    </item> 
</root> 

http://jsfiddle.net/XnmNU/6/ - 工作jFiddle

我的版本进行比较逆水previouse标题,如果其decern愚弄的人或没有,对不起,我做的{编辑子选择!}没有时间绝对优化我在工作中的代码:(

输出> 开始 测试事件1 - 奥斯陆(2011/08/11) 达拉斯(2011/11/11) 测试事件2 - 纽约(2011/09/11) 西雅图(2011/09/11)

$("document").ready(function(){ 
    var xml = "<root>  <item guid='np_108886'>   <title>Test event 1</title>   <description>lorem ipsum</description>   <specfields>    <city>oslo</city>    <startdate>2011/08/11</startdate>   </specfields>  </item>  <item guid='np_108886'>   <title>Test event 1</title>   <description>lorem ipsum</description>   <specfields>    <city>dallas</city>    <startdate>2011/11/11</startdate>   </specfields>  </item>  <item guid='np_108886'>   <title>Test event 2</title>   <description>lorem ipsum</description>   <specfields>    <city>new york</city>    <startdate>2011/09/11</startdate>   </specfields>  </item>  <item guid='np_108886'>   <title>Test event 2</title>   <description>lorem ipsum</description>   <specfields>    <city>seattle</city>    <startdate>2011/09/11</startdate>   </specfields>  </item> </root>",  xmlDoc = $.parseXML(xml); xml = $(xmlDoc); 

    try 
    { 
    $(xml).find('[nodeName=item]').each(function(){ if ($(this).index() != 0) { 
     possitionTitle = $(this).prev(); 
    if ($(this).children('title').text() != possitionTitle.children('title').text()) { 
       $("div").append("</li><li>"+$(this).children('title').text()+" -- "+$(this).children("specfields").children("city").text()+" ("+$(this).children("specfields").children("startdate").text()+")"); 
       } else { 
        $("div").append($(this).children("specfields").children("city").text()+" ("+$(this).children("specfields").children("startdate").text()+")"); 
       } 
     } else { 
      $("div").append("Start<li>"+$(this).children('title').text()+" -- "+$(this).children("specfields").children("city").text()+" ("+$(this).children("specfields").children("startdate").text()+")"); 
     } 
     $("div").append("</li>"); 

    }); 

    } 
catch(err) 
    { 
    alert(err); 
    } 

}); 
<div></div> 
+0

谢谢寻求帮助,像魅力一样工作。我知道我必须检查标题,但无法得到我的头在.prev()... –

+0

@ Terr Marder:让我猜测一个学校项目?:P – John

+0

nope,在明天截止日期之前快速的最后一分钟的项目变更。那些我们都非常喜欢的...... ;-) –

像这样的事情寿LD工作(未经测试):

$(document).ready(function() 
{ 
    $.ajax({ 
    type: "GET", 
    url: "YOUR XML", 
    dataType: "xml", 
    success: parseXml 
    }); 
}); 

function parseXml(xml){ 
    $(xml).find("title").filter(function(){ 
       $(this).text() == "Test event 1"; 
     }).each(function(){ 
      $("#dataDiv").append($(this).find("city").text(); 
      $("#dataDiv").append("(" + $(this).find("startdate").text() + "),"); 
    }); 

    $(xml).find("title").filter(function(){ 
       $(this).text() == "Test event 2"; 
     }).each(function(){ 
      $("#dataDiv").append($(this).find("city").text(); 
      $("#dataDiv").append("(" + $(this).find("startdate").text() + "),"); 
    }); 

} 

其中#dataDiv#dataDiv2在页面上的div只是测试赛1测试赛2在他们里面。

希望这会有所帮助。我已经测试并创建了一个js小提琴:http://jsfiddle.net/xDqZK/

基本上,一旦您在javscript中有xml,您可以使用jquerys parseXML()函数将其获取到jquery对象中。一旦进入对象,您可以使用$ .find()方法搜索不同的节点并在它们之间迭代。一个棘手的事情,如果你想获得节点的价值,你需要使用.text()。我正在使用.val()和.hmtl(),它返回undefined。

var strXml ="<root><item guid=\"np_108886\"><title>Test event 1<\/title><description>lorem ipsum<\/description><specfields><city>oslo<\/city><startdate>2011\/08\/11<\/startdate><\/specfields><\/item><item guid=\"np_108886\"><title>Test event 1<\/title><description>lorem ipsum<\/description><specfields><city>dallas<\/city><startdate>2011\/11\/11<\/startdate><\/specfields><\/item><item guid=\"np_108886\"><title>Test event 2<\/title><description>lorem ipsum<\/description><specfields><city>new york<\/city><startdate>2011\/09\/11<\/startdate><\/specfields><\/item><item guid=\"np_108886\"><title>Test event 2<\/title><description>lorem ipsum<\/description><specfields><city>seattle<\/city><startdate>2011\/09\/11<\/startdate><\/specfields><\/item><\/root>"; 
var xml = $.parseXML(strXml); 

$("#test").html((parse(xml,"Test event 1"))); 

function parse(xml, strEvent) 
{ 
    var eventStr = "",$xml = $(xml); 
    $xml.find("item").each(function(){ 
     if($(this).find("title").text().toLowerCase() == strEvent.toLowerCase()){ 
      var childNode = $(this).find("specfields") 
      eventStr += childNode.find("city").text(); 
      eventStr += " (" + childNode.find("startdate").text() + ") "; 
     } 
    }); 
    return eventStr; 
} 

HTML

<div id="test></div>