在xpath中获取特定数据

时间:2016-07-13 22:33:53

标签: javascript xml xpath

我需要你的帮助,首先我开始使用代码:

bookmod.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>

<book category="COOKING">
    <insystem>
        <t>asdgas</t>
        <b>asdgas</b>
    </insystem>
    <data>
  <Data name="title">Everyday Italian</Data>
  <Data name="author">Giada De Laurentiis</Data>
  <Data name="year">2005</Data>
  <Data name="price">30.00</Data>
  </data>
</book>

<book category="CHILDREN">
    <insystem>
        <t>asdgas</t>
        <b>asdgas</b>
    </insystem>
    <data>

  <Data name="title">Potter Potter</Data>
  <Data name="author">Giada De Laurentiis</Data>
  <Data name="year">2003</Data>
  <Data name="price">30.00</Data>
    </data>
</book>

<book category="WEB">
    <insystem>
        <t>asdgas</t>
        <b>asdgas</b>
    </insystem>
    <data>

  <Data name="title">asdgasd Potter</Data>
  <Data name="author">Giada De Laurentiis</Data>
  <Data name="year">2005</Data>
  <Data name="price">30.00</Data>
    </data>
</book>

<book category="WEB">
    <insystem>
        <t>asdgas</t>
        <b>asdgas</b>
    </insystem>
    <data>

  <Data name="title">web book</Data>
  <Data name="author">Giada De Laurentiis</Data>
  <Data name="year">2005</Data>
  <Data name="price">30.00</Data>
    </data>
</book>

</bookstore>

的index.php

<!DOCTYPE html>
<html>
<body>
<script>

function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else
  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",dname,false);
try {xhttp.responseType="msxml-document"} catch(err) {} // Helping IE
xhttp.send("");
return xhttp;
}

var x=loadXMLDoc("bookmod.xml");
var xml=x.responseXML;
path="/bookstore/book/data/Data";

// code for IE
if (window.ActiveXObject || xhttp.responseType=="msxml-document")
{
xml.setProperty("SelectionLanguage","XPath");
nodes=xml.selectNodes(path);
for (i=0;i<nodes.length;i++)
  {
  document.write(nodes[i].childNodes[0].nodeValue);
  document.write("<br>");
  }
}

// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
var result=nodes.iterateNext();

while (result)
  {
  document.write(result.childNodes[0].nodeValue);
  document.write("<br>");
  result=nodes.iterateNext();
  }
}

</script>
</body>
</html>

在路径中我也尝试: /书店/书/数据[数据= 2005] /数据[@名称= '年']

以及其他许多......

它基本上意味着XML文件非常大,我只需找到那些<data name="year"> == 2005

的文件

我尝试了许多方法和生成器,但仍然无法处理它:(

如果你能输入一个标题和作者,那就太好了。

编辑:

<book xmlns="http://schemas.microsoft.com/win/2004/08/events/event">

我不知道为什么,但因为它不起作用

你知道解决这个问题的方法吗? 当我删除xmlns =“.....一切正常但我有它。

2 个答案:

答案 0 :(得分:2)

以下XPath将从2005年中选择所有book元素:

/bookstore/book[data/Data[@name='year' and .=2005]]

答案 1 :(得分:1)

以下xpath应基本上通过以下输入提供您所需的内容: yeartitleauthor。 这有点像上下遍历。

/bookstore/book/data/Data[@name='year'][.='2005']/preceding-sibling::*[@name='title'][.='Everyday Italian']/following-sibling::*[@name='author'][.='Giada De Laurentiis']/parent::*

您可以将2005Everyday ItalianGiada De Laurentiis替换为您喜欢的输入。

它的工作方式是,它首先得到Data year = 2005然后得到它的前兄弟titleauthor然后匹配title然后得到它的以下兄弟,其author匹配给定输入,最后它的父级返回整个data元素。

上述xpath的输出为:

'<data> <Data name="title">Everyday Italian</Data> <Data name="author">Giada De Laurentiis</Data> <Data name="year">2005</Data> <Data name="price">30.00</Data> </data>'

输出不同的输入:2003Potter PotterGiada De Laurentiis

'<data> <Data name="title">Potter Potter</Data> <Data name="author">Giada De Laurentiis</Data> <Data name="year">2003</Data> <Data name="price">30.00</Data> </data>'