代码之家  ›  专栏  ›  技术社区  ›  michele

获取xml节点的第一个子节点

  •  2
  • michele  · 技术社区  · 14 年前

    我有这个XML文件。 我将提取状态节点的第一个子节点并警告它。 我怎么能做到?

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <ns3:ExecuteResponse xmlns:ns1="http://www.opengis.net/ows/1.1" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns:ns3="http://www.opengis.net/wps/1.0.0" statusLocation="http://r/6de0e29d-8d67-40c3-8189-03f7cd23a0cb" serviceInstance="http://-service/services/http-post" version="1.0.0" service="WPS">
        <ns3:Process ns3:processVersion="0.2">
            <ns1:Identifier>123</ns1:Identifier>
            <ns1:Title xml:lang="en-US">Bioclim</ns1:Title>
            <ns1:Abstract xml:lang="en-US">Uses mean and standard deviation for each environmental variable separately to calculate bioclimatic envelopes. Level of fitness between the environmental values on a point and the respective envelopes classifies points as Suitable, Marginal, or Unsuitable for presence.
    Implements the Bioclimatic Envelope Algorithm. For each given environmental variable the algorithm finds the mean and standard deviation (assuming normal distribution) associated to the occurrence points. Each variable has its own envelope represented by the interval [m - c*s, m + c*s], where 'm' is the mean; 'c' is the cutoff input parameter; and 's' is the standard deviation. Besides the envelope, each environmental variable has additional upper and lower limits taken from the maximum and minimum values related to the set of occurrence points.
    In this model, any point can be classified as:
     Suitable: if all associated environmental values fall within the calculated envelopes;
     Marginal: if one or more associated environmental value falls outside the calculated envelope, but still within the upper and lower limits.
     Unsuitable: if one or more associated enviromental value falls outside the upper and lower limits.
    Bioclim's categorical output is mapped to probabilities of 1.0, 0.5 and 0.0 respectively.</ns1:Abstract>
        </ns3:Process>
        <ns3:Status creationTime="2010-07-08T16:33:03.326+02:00">
    
            <ns3:ProcessStarted/>
        </ns3:Status>
        <ns3:ProcessOutputs>
            <ns3:Output>
                <ns1:Identifier>servicesDocuments</ns1:Identifier>
                <ns1:Title xml:lang="en-US">A json document in which can be published some XML documents relative to the run</ns1:Title>
                <ns3:Data>
                    <ns3:LiteralData>http://hermes.pin.unifi.it:9090/wps-1.0.0-service/publisher/953baf3a-dddf-49cc-a673-7491d82f80b7</ns3:LiteralData>
    
                </ns3:Data>
            </ns3:Output>
            <ns3:Output>
                <ns1:Identifier>extendedStatus</ns1:Identifier>
                <ns1:Title xml:lang="en-US">WPS status in JSON format</ns1:Title>
                <ns3:Data>
                    <ns3:LiteralData>{&quot;globalStatus&quot;:&quot;processExecution&quot;,&quot;resourceList&quot;:[]}</ns3:LiteralData>
    
                </ns3:Data>
            </ns3:Output>
        </ns3:ProcessOutputs>
    </ns3:ExecuteResponse>
    

    我正在使用jquery。 我已经在DOM中转换了XML,现在必须查询它来提取状态节点的子级。

     $.ajax({
        type: 'GET',
        url: "php/proxy.php?proxy_url=" + obj.requests[i].output,
                            contentType: "text/xml",
        dataType: "text/xml",
        async:false,
        success: function(xml){
          var $dom = $.xmlDOM(xml, function(error){
         alert('A parse error occurred! ' + error);
        });
                                    //extract data
    
          }});
    

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  3
  •   artlung    14 年前

    这对我有用。我优化了如何处理从中获取XML的URL。

    var url = 'php/proxy.php';
    var obj = { requests: [{output: 'foo'}] }, i = 0; // shims
    $.ajax({
        url: url,
        type: 'GET',
        // This is a better way to pass querystring params
        data: { 'proxy_url': obj.requests[i].output },
        dataType: "xml",
        async: false,
        success: function(xmlData, textStatus, XMLHttpRequest){
            // How do we get ahold of the ns3:Status element?
            // We must escale the ":" character:
            var $ns3Status = $('ns3\\:Status', xmlData);
            alert($ns3Status.attr('creationTime')); // we can get an attribute
            alert($ns3Status.get(0).tagName); // we can get tagName
    
            // Let's iterate over the children of the ns3:Status element
            $ns3Status.children().each(function(){
                alert($(this).get(0).tagName);
            });
        }
    });
    
        2
  •  1
  •   Tim Down    14 年前

    使用“xml”数据类型以避免解析xml。(这是我第三次向你提出这个建议。你从来没有说过为什么你不能那样做)。注意,在IE中,第一个孩子将是 <ns3:ProcessStarted> 元素,而在其他浏览器中,它将是包含空白的文本节点。

    $.ajax({
        type: 'GET',
        url: "php/proxy.php?proxy_url=" + obj.requests[i].output,
        contentType: "text/xml",
        dataType: "xml",
        async: false,
        success: function(xml) {
            var statusNode = xml.getElementsByTagName("ns3:Status")[0];
            alert(statusNode.firstChild);
        }
    });
    

    如果愿意,可以将XML文档包装在jquery对象中,这样可以忽略空白节点的问题:

    $.ajax({
        type: 'GET',
        url: "php/proxy.php?proxy_url=" + obj.requests[i].output,
        contentType: "text/xml",
        dataType: "xml",
        async: false,
        success: function(xml) {
            var node = $(xml).find("ns3\\:Status").find(":first-child");
            alert(node[0].tagName);
        }
    });
    
        3
  •  0
  •   Jason Brant    14 年前

    有一些非常好的jquery插件可以帮助解决这个问题。我最近使用了一个xml2json插件,所以我可以使用json语法引用返回的XML的特定部分。

    var ExecuteResponse = jQuery.xml2json(xml);
    var firstStatusChild = ExecuteResponse.Status[0];