繁体   English   中英

XML / javascript解析节点-通过名称指定子级

[英]XML/javascript parsing nodes - specify child by name

用于包含带有SKU和数量的销售订单和明细的XML字符串...

var myOrders = 
"<?xml version='1.0' encoding='UTF-8'?>" +
"<Orders>" +
   "<Order>" +
      "<OrderHeader>" +
          "<OrderNo>12345</OrderNo>" +
      "</OrderHeader>" +
      "<OrderDetails>" +      
         "<Sku>ABC</Sku>" +
         "<Qty>2</Qty>" +
         "<Sku>DEF</Sku>" +
         "<Qty>3</Qty>" +
      "</OrderDetails>" +
   "</Order>"....
"</Orders>";

我可以像这样用Mozill中的javascript解析。

parser=new DOMParser();
xmlDoc=parser.parseFromString(myOrders,"text/xml");    
myValue = xmlDoc.getElementsByTagName("Order");

// list all all SKUs ordered
for(i = 0; i < myValue.length; i++){    
    console.log(myValue);
    var order = myValue[i].firstChild.firstChild.firstChild.nodeValue;
    document.write(order + "<br>");
}

我可以替换此行:

    var order = myValue[i].firstChild.firstChild.firstChild.nodeValue;

有一些更具体的

就像是...

  var order = myValue[i]['Order']['OrderDetail']['Sku'].nodeValue;

您可以尝试使用querySelector

myValue[i].querySelector('OrderHeader > OrderNo').textContent

还考虑querySelectorAll

var elements = xmlDoc.querySelectorAll("Order > OrderHeader > OrderNo");
for(var i = 0; i < elements.length; i++){    
    var order = elements[i].textContent;
}

使用querySelector和querySelectorAll,这似乎可行。 我可以提高效率吗? 我似乎不必使用完整路径(A> B> C)。 请注意,我在下面的示例中添加了OrderDetail标记。 我验证了这一点,但看起来更干净。

var myOrders = 
"<?xml version='1.0' encoding='UTF-8'?>" +
"<Orders>" +
   "<Order>" +
      "<OrderHeader>" +
          "<OrderNo>12345</OrderNo>" +
      "</OrderHeader>" +
      "<OrderDetails>" +      
         "<OrderDetail>" +    
            "<Sku>ABC</Sku>" +
            "<Qty>2</Qty>" +
         "</OrderDetail>" +   
         "<OrderDetail>" +    
            "<Sku>DEF</Sku>" +
            "<Qty>4</Qty>" +
         "</OrderDetail>" +   
      "</OrderDetails>" +
   "</Order>"...;

document.write("</br>4. Get all Orders Numbers and SKU Ordered for each Order</br>");
myOrders= xmlDoc.getElementsByTagName("Order"); 
// iterate through orders
for(x = 0; x < myOrders.length; x++){           
    var myOrder = myOrders[x].querySelector('OrderNo').textContent;
    document.write(myOrder + "</br>");

// iterate through SKUS in each order
    var mySkus = myOrders[x].querySelectorAll('OrderDetail > Sku');     
    for(y = 0; y < mySkus.length; y++){                     
        document.write("-- SKU: " + mySkus[y].firstChild.nodeValue + "</br>");
    }
}
document.write("<hr>");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM