【问题标题】:Get specific data in xpath在 xpath 中获取特定数据
【发布时间】:2016-07-13 22:33:53
【问题描述】:

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

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>

在路径中我也尝试: /bookstore/book/data[Data=2005]/Data[@name='year']

还有很多其他...

这基本上意味着一个 XML 文件非常大,我只需要找到那些 &lt;data name="year"&gt; == 2005 的文件

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

如果你能输入标题和作者就好了。


编辑:

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

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

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

【问题讨论】:

    标签: javascript xml xpath


    【解决方案1】:

    以下 XPath 将选择 2005 年以来的所有 book 元素:

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

    【讨论】:

    • 你知道调试器吗?
    • 您的编辑添加了一个命名空间,这有效地更改了 book 及其后代的元素名称。您可以通过测试local-name() 来阻止命名空间,或者最好定义一个命名空间前缀并使用它:参见XPath without using local-name() or name() functions,或者请提出一个新问题。谢谢。
    【解决方案2】:

    以下 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 替换为您喜欢的输入。

    它的工作方式是,它首先得到Datayear = 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>'

    【讨论】:

    • 在这个文件中一切正常,但我有一个类似的文件,非常相似,但这种方法对我不起作用。 /Events/Event/data/Data[@Name='day'][.='101']/preceding-sibling::*[@name='Adapter']";
    • 对于第一个问题,请添加您的新 xml,以便我看看可能有什么问题。对于第二个,请使用local-name() like //*[local-name()='book']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多