Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当标记名在多个级别上相同时,使用JavaScript解析XML_Javascript_Xml_Parsing - Fatal编程技术网

当标记名在多个级别上相同时,使用JavaScript解析XML

当标记名在多个级别上相同时,使用JavaScript解析XML,javascript,xml,parsing,Javascript,Xml,Parsing,我正在尝试使用JavaScript解析一个XML文件,该文件具有相当复杂的嵌套。提供的示例是我所指内容的一个片段。基本问题是,多个级别的标签具有相同的名称,例如,样本中的水果。我需要有能力 提取特定于嵌套级别的信息,而不仅仅是getElementsByTagNamesfruit。换句话说,参考上面的示例,标签名fruit嵌套了3层-我的目标是提取,比如说,只提取第二层的fruit信息 我如何才能最好地完成这一点?我想我需要参考节点之间的父/子关系,但我不确定如何继续 提前感谢。您可以使用XPat

我正在尝试使用JavaScript解析一个XML文件,该文件具有相当复杂的嵌套。提供的示例是我所指内容的一个片段。基本问题是,多个级别的标签具有相同的名称,例如,样本中的水果。我需要有能力 提取特定于嵌套级别的信息,而不仅仅是getElementsByTagNamesfruit。换句话说,参考上面的示例,标签名fruit嵌套了3层-我的目标是提取,比如说,只提取第二层的fruit信息

我如何才能最好地完成这一点?我想我需要参考节点之间的父/子关系,但我不确定如何继续


提前感谢。

您可以使用XPath,它允许您使用希望使用的元素的完整或部分路径来选择元素。例如:

<?xml version="1.0" encoding="utf-8"?>
<section food="Fruit">
  <desc>Fruits of the World</desc>
  <fruit>
    <name>grapes</name>
    <desc>grow on vines</desc>
    <fruit>
      <name>seeded</name>
      <desc>seeded grapes</desc>
    </fruit>
    <fruit>
      <name>seedless</name>
      <desc>no seeds</desc>
      <fruit>
        <name>seedless Concord blue</name>
        <desc>deep blue without seeds</desc>
      </fruit>
      <fruit>
        <name>seedless Concord red</name>
        <desc>rose colored without seeds</desc>            
      </fruit>
    </fruit>
  </fruit>
</section>
将返回在该级别找到的两个水果节点中的第一个节点的名称“无籽协和蓝”。使用水果[2]可以找到另一个节点

您可以检索任何节点:

/section/fruit/fruit/fruit[1]/name
返回“无种子”,并且

/section/fruit/fruit[2]/desc
返回“Fruit”节中食物属性的内容

您可以使用document.evaluate计算XPath表达式:


有很多关于XPath的教程,您可以在或

的文档中了解如何运行和配置DOM evaluate方法如果您针对的是现代浏览器,您可以使用CSS样式选择器来获取第一个匹配元素或获取所有元素。要仅获取第二级,您可以使用选择器部分>水果>水果:

对于较旧的浏览器,@helderdarocha对XPath的建议非常好

/section/@food
var fruitName = document.evaluate("/section/fruit/fruit/fruit/name[1]", document, null, XPathResult.ANY_TYPE, null);
var first2ndLevelFruit = document.querySelector("section > fruit > fruit")
console.log( first2ndLevelFruit.querySelector("desc").textContent );
// => seeded grapes

var all2ndLevelFruits = document.querySelectorAll("section > fruit > fruit");
Array.prototype.forEach.call( all2ndLevelFruits, function(fruit) {
  console.log( fruit.querySelector("desc").textContent );
} );
// => seeded grapes
//    no seeds